2014-09-01 56 views
4

我正在使用EF 6 Database.SqlQuery语句来执行带有已实现的错误和事务处理,具有打开和关闭事务的存储过程(处理多个记录,如果有错误只有一个记录只能回滚这个,并且承诺完成其他任何没有错误的事情)。EF ef Database.SqlQuery内部回滚到执行的存储过程

List<T> _result = this.Database.SqlQuery<T>(sqlStatement, parameters).ToList(); 

EF使用自己的交易,Database.SqlQuery的执行,但是当错误occures,我也回滚到存储过程中这种回滚也适用于EF transacton。所以我得到的follwoing例外:

System.Data.SqlClient.SqlException(0x80131904):当前 事务不能被提交并不能支持该操作写入 到日志文件。回滚事务。

如何防止EF在这种情况下使用自己的事务,或防止过程关闭EF的事务?

+1

不要在你的存储过程回滚。抛出异常并让客户端处理它。 – usr 2014-09-01 13:34:49

+0

我不想更改SP错误处理,因为只能对其中的一个处理记录进行回滚。我希望没有错误的记录被提交。 – 2014-09-01 13:41:02

+0

然后,您需要使EF无法启动交易。如果存在外部事务,则所有行都将全部或全部不存在。 – usr 2014-09-01 13:52:21

回答

0

我发现在这种情况下没有通过.SqlQuery命令添加额外的事务,但是错误是由执行过程生成的初始化执行的存储过程(你有点复杂但它确实是必需的)。不过,我用外部EntityFramework事务与.ObjectContext.ExecuteStoreCommand这个问题,但我解决了这个问题,使用TransactionalBehavior.DoNotEnsureTransaction行为。

例如:

 using (INotificationDataContext context = DataContextFactory.Create<INotificationDataContext>()) 
     { 
      result = (context as IObjectContextAdapter).ObjectContext.ExecuteStoreCommand(TransactionalBehavior.DoNotEnsureTransaction, sql, parameters); 
     }