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)
这会在您尝试读取之前设置隔离级别.
这通常不建议使用,因为您可以读取部分数据的"脏"但是我正在做什么.
| 归档时间: |
|
| 查看次数: |
16034 次 |
| 最近记录: |