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

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();
}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top