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

Jam*_*mes 13 entity-framework transactions

可能重复:
使用NOLOCK的实体框架

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

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

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

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

entities.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
Run Code Online (Sandbox Code Playgroud)

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

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

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

            transaction.Complete();
       }
Run Code Online (Sandbox Code Playgroud)

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

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

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

在此先感谢您的帮助.

詹姆士

Jam*_*mes 13

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

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

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

这会在您尝试读取之前设置隔离级别.

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

  • 这不起作用.单独设置事务隔离级别不会产生任何影响.实际上,您需要在事务中运行才能产生任何效果.READ UNCOMMITTED的MSDN文档说明在READ UNCOMMITTED级别运行的事务不会发出共享锁.这意味着您必须在事务中运行才能获得收益.(摘自msdn.microsoft.com/en-gb/library/ms173763.aspx).您的方法可能不那么具有侵入性,但如果您不使用交易,它将无法实现任何目标. (3认同)