我正在使用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不使用事务?
感谢您提前提供任何帮助。
詹姆斯
答案 0 :(得分:13)
只是把它放到床上即将发布我的解决方案。
我基本上是从问题的错误结束看这个,在调用SaveChanges()
时使用了一个事务,但你仍然可以使用这样的方法读取数据库:
private static FrameEntities GetEntities()
{
FrameEntities entities = new FrameEntities();
entities.ExecuteStoreCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;");
return entities;
}
这会在您尝试阅读之前设置隔离级别。
这通常不建议使用,因为您可以读取部分数据的“脏”但是我正在做什么。