如何强制实体框架不要锁定数据库

时间:2010-03-22 13:34:29

标签: entity-framework transactions

  

可能重复:
  Entity Framework with NOLOCK

我正在使用EF4和.Net 4将一些XML从文件加载到数据库中。

我有一个围绕ObjectContext的类,并且有一些方法可以将XML文件中的编组对象添加到代表我的表的各种EntityCollections中。

每个XML文件平均包含大约200,000个对象,包装类在构造时创建ObjectContext并将引用存储在本地私有类变量中,然后由方法使用。

当我完成创建我打电话的实体时:

entities.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);

这会在服务器上创建一个根据EntityFramework设计的事务。但是,即使在未添加到的表上,此事务也完全锁定了我的数据库。

我尝试了各种各样的事情来解决这个问题,包括在TransactionScope中包含保存更改​​,如下所示:

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress,
       new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }))
       {
            entities.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);

            transaction.Complete();
       }

我还尝试在创建ObjectContext之前创建TransactionScope,以试图影响在SaveChanges期间使用的基础事务。

理想情况下,我希望一次加载多个文件,但如果在保存更改期间锁定了数据库,则无法执行此操作。

有没有人知道解决这个问题的方法?有没有强制EntityFramework不使用事务?

感谢您提前提供任何帮助。

詹姆斯

1 个答案:

答案 0 :(得分:13)

只是把它放到床上即将发布我的解决方案。

我基本上是从问题的错误结束看这个,在调用SaveChanges()时使用了一个事务,但你仍然可以使用这样的方法读取数据库:

private static FrameEntities GetEntities()
    {
        FrameEntities entities = new FrameEntities();
        entities.ExecuteStoreCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;");
        return entities;
    }

这会在您尝试阅读之前设置隔离级别。

这通常不建议使用,因为您可以读取部分数据的“脏”但是我正在做什么。