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;
}
Foi útil?

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();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top