LINQ to SQL ¿Cómo puedo enviar cambios después de cerrar la conexión?
-
12-12-2019 - |
Pregunta
Estoy accediendo a una base de datos usando LINQ y realizando cambios en los registros.Recupero los registros así:
using(var db = new DatabaseDataContext(connectionString))
{
var query =
from item in db.table
where item.senddate == null
select item;
results = query.ToList();
}
Después de obtener los elementos, proceso cada uno, lo que requiere comunicación con un servicio web y puede llevar más de un minuto por registro.Cuando el registro se haya actualizado, necesito enviar los cambios, pero no estoy seguro de cómo proceder.Actualmente hago lo siguiente:
List<table> toProcess = QueryDb(); // Calls the previously displayed method
foreach (table item in toProcess)
{
item.result = QueryDb(item.xmlrequest);
PostToDb(item);
}
...
private bool PostToDb(table submit)
{
submit.senddate = DateTime.Now;
using (var db = new DatabaseDbDataContext(connectionString))
{
db.SubmitChanges();
}
return result;
}
db.SubmitChanges()
no envía ningún cambio, pero realmente no he configurado que el objeto "enviar" contenga los cambios.¿Cómo envío los cambios realizados en la entrada sin mantener abierta la conexión a la base de datos durante varios minutos mientras los archivos se procesan uno a la vez?
Gracias de antemano por cualquier ayuda.
PARCIALMENTE RESUELTO
No creo que esta sea la mejor solución, pero pude hacerla funcionar con los siguientes cambios en mi código:
private bool PostToDb(table submit)
{
using (var db = new DatabaseDataContext(connectionString))
{
var query =
from item in db.table
where item.iprimaryid.Equals(submit.iprimaryid)
select item;
// There can only be one result, but this was the only
// way I could think to access it
foreach (var item in query)
{
item.senddate = DateTime.Now;
item.result = submit.result;
}
db.SubmitChanges();
}
return result;
}
Solución
Necesitas usar el Attach
método para su DataContext
.Entonces, tus pasos son:
1) Consulta el objeto de la base de datos usando una instancia de tu DataContext
2) Haz algunos cambios
3) Crea el nuevo DataContext
instancia y adjuntar entidades modificadas.
using (var dataContext = new DataContext(ConnectionString))
{
dataContext.TABLE_NAME.Attach(modifiedEntity);
dataContext.SubmitChanges();
}
Otros consejos
¿Puede declarar su contexto de datos en un alcance exterior y pasarlo como un parámetro a los métodos que deben acceder a la base de datos?Algo así:
using (var db = new DatabaseDbDataContext(connectionString))
{
var toProcess = QueryDb(db);
// Do whatever processing you need to do...
toProcess.ForEach(t => t.SendDate = DateTime.Now);
db.SubmitChanges();
}