Tengo una tabla de Mensajes con ID de columnas (clave principal, autoincremento) y Contenido (texto).
Tengo una tabla de Usuarios con columnas de nombre de usuario (clave principal, texto) y Hash.
Un remitente (usuario) envía un mensaje a muchos destinatarios (usuario) y un destinatario (usuario) puede tener muchos mensajes.
Creé una tabla Messages_Recipients con dos columnas: MessageID (refiriéndose a la columna ID de la tabla Messages y Recipient (refiriéndose a la columna de nombre de usuario en la tabla Users). Esta tabla representa la relación de muchos a muchos entre destinatarios y mensajes.
Entonces, la pregunta que tengo es esta. El ID de un mensaje nuevo se creará después de que se haya almacenado en la base de datos. Pero, ¿cómo puedo tener una referencia al MessageRow que acabo de agregar para recuperar este nuevo MessageID?
Siempre puedo buscar en la base de datos la última fila agregada, por supuesto, pero ¿eso podría devolver una fila diferente en un entorno multiproceso?
EDITAR: Según tengo entendido para SQLite, puede usar SELECT last_insert_rowid()
. Pero, ¿cómo llamo a esta declaración de ADO.Net?
Mi código de persistencia (los mensajes y los destinatarios de los mensajes son tablas de datos):
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);
}