Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架6在数据库级别处理事务_C#_Sql Server_Entity Framework_Transactions_Entity Framework 6 - Fatal编程技术网

C# 实体框架6在数据库级别处理事务

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

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

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

 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。此版本包含函数和命令方法的重新传输。我