我有一个在数据库级别使用事务的存储过程(事务在存储过程本身内处理)。这意味着我需要告诉实体框架不要处理事务。
现在使用数据库第一模型我可以导入存储过程并拥有一个自动生成的上下文类,如下所示:
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.5.1/moment.min.js"></script>
我可以将自己的方法添加到 public virtual int MyStoredProcedure()
{
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("MyStoreProcedure");
}
类,如下所示:
DbContext
我的问题是,在事务管理方面,以下代码的行为与public virtual int MyStoredProcedureWithoutTransaction()
{
this.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, "MyStoredProcedure")
}
的行为相同:
MyStoredProcedureWithoutTransaction()
如果确实如此,我宁愿使用第二个版本,因为它具有使用Entity Framework中自动生成的代码的优势。
答案 0 :(得分:2)
如果有人遇到这篇文章,并且想知道答案是否定的!
context.Database.UseTransaction(null);
与在TransactionalBehavior.DoNotEnsureTransaction
重载方法上使用ExecuteSqlCommand
不同。
然而,以下方法确实有效,可以按原来的方式使用:
((IObjectContextAdapter)_context).ObjectContext.ContextOptions.EnsureTransactionsForFunctionsAndCommands = false;
在应用程序中,我只是创建了一个基本存储库类,如下所示:
public abstract class BaseEntityFrameworkNonTransactionRepository<T> where T : DbContext, new()
{
protected T _context;
protected BaseEntityFrameworkNonTransactionRepository()
{
_context = new T();
((IObjectContextAdapter)_context).ObjectContext.ContextOptions.EnsureTransactionsForFunctionsAndCommands = false;
}
}