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

entity-framework transactions

可能重复:
使用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期间使用的基础事务。

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

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

在此先感谢您的帮助。

詹姆士

一般承认的答案

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

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

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

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

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



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因