C# 实体框架6在数据库级别处理事务
我有一个在数据库级别使用事务的存储过程(事务在存储过程本身中处理)。这意味着我需要告诉EntityFramework不要处理事务 现在,使用database first模型,我可以导入存储过程并拥有一个自动生成的上下文类,如下所示:C# 实体框架6在数据库级别处理事务,c#,sql-server,entity-framework,transactions,entity-framework-6,C#,Sql Server,Entity Framework,Transactions,Entity Framework 6,我有一个在数据库级别使用事务的存储过程(事务在存储过程本身中处理)。这意味着我需要告诉EntityFramework不要处理事务 现在,使用database first模型,我可以导入存储过程并拥有一个自动生成的上下文类,如下所示: public virtual int MyStoredProcedure() { return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("MyStorePr
public virtual int MyStoredProcedure()
{
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("MyStoreProcedure");
}
public virtual int MyStoredProcedureWithoutTransaction()
{
this.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, "MyStoredProcedure")
}
我可以将自己的方法添加到DbContext
类中,如下所示:
public virtual int MyStoredProcedure()
{
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("MyStoreProcedure");
}
public virtual int MyStoredProcedureWithoutTransaction()
{
this.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, "MyStoredProcedure")
}
我的问题是,以下代码在事务管理方面是否与MyStoredProcedureWithoutTransaction()的行为相同:
MyContext context = new MyContext();
context.Database.UseTransaction(null);
context.MyStoredProcedure();
如果是这样的话,我更愿意使用第二个版本,因为它将具有使用Entity Framework自动生成代码的优势。如果有人看到这篇文章并想知道答案是否
context.Database.UseTransaction(null);
与在ExecuteSqlCommand
重载方法上使用TransactionalBehavior.DoNotEnsureTransaction
不同
但是,以下内容确实有效,可以按照我最初的想法使用:
((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;
}
}
公共抽象类BaseEntityFrameworkNoTransactionRepository,其中T:DbContext,new()
{
受保护的T_上下文;
受保护的BaseEntityFrameworkNonTransactionRepository()
{
_上下文=新的T();
((IObjectContextAdapter)_context.ObjectContext.ContextOptions.EnsureTransactionsForFunctions和Commands=false;
}
}
您可能可以运行Sql Server探查器来确认……这解决了我的解决方案:)酷!非常感谢。已将EF版本从6.0.0.0更新到6.4.4。此版本包含函数和命令方法的重新传输。我