LINQ to SQL Como posso enviar alterações após fechar a conexão?
-
12-12-2019 - |
Pergunta
Estou acessando um banco de dados utilizando LINQ, e fazendo alterações nos registros.Eu recupero os registros assim:
using(var db = new DatabaseDataContext(connectionString))
{
var query =
from item in db.table
where item.senddate == null
select item;
results = query.ToList();
}
Após obter os itens, processo cada um deles, o que requer comunicação com um serviço web, podendo levar mais de um minuto por registro.Quando o registro for atualizado, preciso enviar as alterações, mas não sei como proceder.Atualmente, faço o seguinte:
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()
não envia nenhuma alteração, mas ainda não defini que o objeto "enviar" retém as alterações.Como faço para enviar as alterações feitas na entrada sem manter a conexão do banco de dados aberta por vários minutos enquanto os arquivos são processados um de cada vez?
Agradecemos antecipadamente por qualquer ajuda.
PARCIALMENTE RESOLVIDO
Não acho que essa seja a melhor solução, mas consegui fazê-la funcionar com as seguintes alterações em meu 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;
}
Solução
Você precisa usar o Attach
método para o seu DataContext
.Então, seus passos são:
1) Consulte o objeto do banco de dados usando uma instância do seu DataContext
2) Faça algumas alterações
3) Crie o novo DataContext
instância e anexar entidades modificadas.
using (var dataContext = new DataContext(ConnectionString))
{
dataContext.TABLE_NAME.Attach(modifiedEntity);
dataContext.SubmitChanges();
}
Outras dicas
Você pode declarar seu contexto de dados em um escopo externo e passá-lo como parâmetro para os métodos que precisam acessar o banco de dados?Algo assim:
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();
}