如何在执行许多更新时避免在实体框架4中锁定数据库

Gra*_*hes 15 c# sql entity-framework

此问题涉及使用Microsoft Entity Framework处理许多插入或更新的最佳实践.问题是我们编写了一个长期运行的程序,它从数据库中回收了数千条记录,然后逐个更新每条记录上的单个字段.令我们沮丧的是,我们意识到更新的每个记录都会在未处理ObjectContext的时间内被锁定.下面是一些伪代码(实际上没有运行)来说明:

using(ObjectContext context = new ObjectContext())
{

    var myRecords = context.CreateObjectSet<MyType>().AsQueryable();

    foreach(var record in myRecords)
    {
       record.MyField = "updated!";
       context.SaveChanges();

       //--do something really slow like call an external web service
   }
}
Run Code Online (Sandbox Code Playgroud)

问题是我们需要做很多更新而不考虑交易.我们惊讶地发现调用context.SaveChanges()实际上会在记录上创建锁,并且在释放ObjectContext之前不会释放它.我们特别不想锁定数据库中的记录,因为这是一个高流量系统,程序可能会运行数小时.

所以问题是:在Microsoft Entity Framework 4中进行许多更新的最佳方法是什么,而不是在锁定数据库的一个长事务上完成所有更新?我们希望答案不是为每个更新创建一个新的ObjectContext ......

Lad*_*nka 7

默认情况下,SQL服务器顶部的实体框架使用读取已提交事务隔离级别,并在最后提交事务SaveChanges.如果您怀疑其他行为,则必须使用其余代码(您使用的是TransactionScope? - 您没有在代码中显示它)或者它必定是一些错误.

你的方法也错了.如果要单独保存每条记录,还应单独加载每条记录.EF对于这类应用来说绝对是不错的选择.即使您只使用单个SaveChange更新所有记录,它仍然会为每次更新单个往返数据库.