【问题标题】:Entity Framework 6 Handle Transaction At Database LevelEntity Framework 6 在数据库级别处理事务
【发布时间】:2017-01-06 09:30:06
【问题描述】:

我有一个在数据库级别使用事务的存储过程(事务在存储过程本身内处理)。这意味着我需要告诉 Entity Framework 不要处理事务。

现在使用数据库优先模型,我可以导入存储过程并拥有一个自动生成的上下文类,如下所示:

 public virtual int MyStoredProcedure()
 {         
    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("MyStoreProcedure");
 }

我可以将自己的方法添加到 DbContext 类中,如下所示:

public virtual int MyStoredProcedureWithoutTransaction()
{
    this.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, "MyStoredProcedure")
}

我的问题是以下代码在事务管理方面是否也与MyStoredProcedureWithoutTransaction() 相同:

MyContext context = new MyContext();
context.Database.UseTransaction(null);
context.MyStoredProcedure();

如果是这样,我更喜欢使用第二个版本,因为它具有使用 Entity Framework 自动生成的代码的优势。

【问题讨论】:

  • 您可能可以运行 Sql Server Profiler 来确认...

标签: c# sql-server entity-framework transactions entity-framework-6


【解决方案1】:

如果有人看到这篇文章并想知道答案是否定的!

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;
    }
}

【讨论】:

  • 这解决了我的解决方案 :) 酷!谢谢!将 EF 版本从 6.0.0.0 更新到 6.4.4,此版本包含 EnsureTransactionsForFunctionsAndCommands 方法。我
猜你喜欢
  • 2016-06-22
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
相关资源
最近更新 更多