LINQ to SQL如何在关闭连接后提交更改?

时间:2012-07-27 17:33:45

标签: sql linq submitchanges

我正在使用LINQ访问数据库,并对记录进行更改。我像这样检索记录:

using(var db = new DatabaseDataContext(connectionString))
{
    var query =
        from item in db.table
        where item.senddate == null
        select item;

    results = query.ToList();
}

获取项目后,我处理每个项目,这需要与Web服务进行通信,每条记录可能需要超过一分钟。记录更新后,我需要提交更改,但我不知道如何继续。目前,我执行以下操作:

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()没有提交任何更改,但我还没有确定对象“submit”保存更改。如何在不保持Db连接打开几分钟的情况下提交对条目所做的更改,同时一次处理一个文件?

提前感谢你的帮助。

部分解决

我认为这不是最好的解决方案,但我能够让它与我的代码进行以下更改:

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

2 个答案:

答案 0 :(得分:3)

您需要对Attach使用DataContext方法。所以,你的步骤是:

1)使用DataContext的一个实例从数据库中查询对象  2)做一些改变  3)创建新的DataContext实例并附加修改后的实体。

using (var dataContext = new DataContext(ConnectionString))
{
     dataContext.TABLE_NAME.Attach(modifiedEntity);
     dataContext.SubmitChanges();
}

答案 1 :(得分:0)

您是否可以在外部作用域中声明数据上下文,并将其作为参数传递给需要访问数据库的方法?像这样:

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