У меня есть таблица Сообщения с идентификаторами колонок (первичный ключ, автоинкремент) и Контент (текст).
У меня есть таблица Пользователи с именами столбцов (первичный ключ, текст) и Hash.
Сообщение отправляется одним отправителем (пользователем) многим получателям (пользователю), а получатель (пользователь) может иметь много сообщений.
Я создал таблицу Messages_Recipients с двумя столбцами: MessageID (ссылаясь на столбец идентификатора таблицы сообщений и получателя (ссылаясь на столбец имени пользователя в таблице "Пользователи" ). Эта таблица представляет собой много-много отношений между получателями и сообщениями.
Итак, у меня есть вопрос. Идентификатор нового сообщения будет создан после того, как он будет сохранен в базе данных. Но как я могу использовать ссылку на MessageRow, которую я только что добавил, чтобы получить этот новый MessageID?
Я всегда могу найти базу данных для последней добавленной строки, но возможно, что она может возвращать другую строку в многопоточной среде?
EDIT: как я понимаю, для SQLite вы можете использовать SELECT last_insert_rowid(). Но как я могу назвать это утверждение из ADO.Net?
Мой код Persistence (сообщения и сообщенияRecipients - это DataTables):
public void Persist(Message message)
{
pm_databaseDataSet.MessagesRow messagerow;
messagerow=messages.AddMessagesRow(message.Sender,
message.TimeSent.ToFileTime(),
message.Content,
message.TimeCreated.ToFileTime());
UpdateMessages();
var x = messagerow;//I hoped the messagerow would hold a
//reference to the new row in the Messages table, but it does not.
foreach (var recipient in message.Recipients)
{
var row = messagesRecipients.NewMessages_RecipientsRow();
row.Recipient = recipient;
//row.MessageID= How do I find this??
messagesRecipients.AddMessages_RecipientsRow(row);
UpdateMessagesRecipients();//method not shown
}
}
private void UpdateMessages()
{
messagesAdapter.Update(messages);
messagesAdapter.Fill(messages);
}