2017-08-24 27 views
0

我需要像下面进行交易:EF6提交的数据读

  1. 开始交易:在这里,我呼吁context.Database.BeginTransaction()(请注意context这里就不下同一个的问题,我想读未提交)
  2. 保存联系(使用存储过程完成):此usp也有一个事务。
  3. 创建基于接触一些其他记录
  4. 提交

我遇到的问题是,在步骤3,我需要从数据库中读取一些数据(使用EF应用端做),这尚未提交(从第2步开始)。我试图这样做,但它不工作:

context.Database.ExecuteSqlCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;"); 
var contact = context.Contact.SingleOrDefault(x => x.ContactId == intId); 
context.Database.ExecuteSqlCommand("SET TRANSACTION ISOLATION LEVEL READ COMMITTED;"); 

我有调试器中运行,并在其中contact,正在获取的暂停,但什么都不会返回。

如果我查询的SSMS(SQL服务器MGMT工作室)相同的记录,它返回的结果:

set transaction isolation level read uncommitted 
select * from Contact c where c.ContactId = 9999 

问题

  1. 我怎样才能读取使用EF6未提交的数据?一些在线搜索引导我创建一个自定义拦截器,但我真的需要吗?
  2. 许多文章建议不读取未提交的数据,但我想不出另一种方式来实现这一点。在那儿?
+0

实际上步骤1是什么?如果你做了'var tr = context.Database.BeginTransaction();',那么使用同样''context''的未来操作应该看到那个事务中未提交的变化。 –

+0

@IvanStoev它只是'this.context.Database.BeginTransaction();'但这与问题中的不一样。 – CodingYoshi

+0

我明白了。然后尝试'BeginTransaction(System.Data.IsolationLevel.ReadUncommitted)',它似乎工作(快速测试)。 –

回答

0

您可以尝试包装你的数据库访问代码在TransactionScope,像这样:

using (var scope = new TransactionScope(TransactionScopeOption.Required, 
       new TransactionOptions() { IsolationLevel = IsolationLevel.ReadUncommitted })) 

你是如何开始你的交易?我问,因为如果代码流如您所描述的那样,则步骤2和步骤3中的所有操作都应该在同一个事务中完成,并且该事务应该能够看到同一事务中先前操作所做的任何更改。

您也可以尝试使用SQL Server Profiler来观察数据库交互并查看是否正在创建其他(新)事务。

如果您发布了执行步骤1至4的实际代码,它可能会有所帮助。

+0

我编辑了我的问题,是的,还有其他交易。 – CodingYoshi