У мене є таблиця Повідомлення з ідентифікаторами стовпців (первинний ключ, автоінкремент) та вмістом (текст).
У мене є таблиця Користувачі зі стовпцями ім'я користувача (первинний ключ, текст) і хеш.
Повідомлення надсилається одним Відправником (користувачем) багатьом одержувачам (користувач), і одержувач (користувач) може мати багато повідомлень.
Я створив таблицю Messages_Recipients з двома стовпцями: MessageID (посилаючись на стовпець ID таблиці Messages та Recipient (маючи на увазі стовпець з іменем користувача в таблиці Користувачі). Ця таблиця представляє відношення "багато до багатьох" між одержувачами та повідомленнями.
Отже, питання у мене таке. Ідентифікатор нового повідомлення буде створений після того, як його буде збережено в базі даних. Але як я можу зберігати посилання на щойно доданий MessageRow для отримання цього нового ідентифікатора MessageID?
Я завжди можу шукати в базі даних останній доданий рядок, звичайно, але це може повернути інший рядок у багатопотоковому середовищі?
EDIT: Як я розумію, для SQLite ви можете використовувати SELECT last_insert_rowid()
. Але як мені назвати це твердження з ADO.Net?
Мій код постійності (повідомлення та повідомленняRecipients - це таблиці даних):
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);
}