C# 实体框架调用事务中的存储过程

C# 实体框架调用事务中的存储过程,c#,stored-procedures,entity-framework-6,C#,Stored Procedures,Entity Framework 6,我有一个理解上的问题。我们有以下代码,用实体框架调用存储过程 using (var context = new MyDbContext()) { using (var transaction = context.BeginTransaction(IsolationLevel.ReadCommitted)) { var task = await context.DuplicateElementStartAsync(transaction, sessionId).

我有一个理解上的问题。我们有以下代码,用实体框架调用存储过程

using (var context = new MyDbContext()) 
{
    using (var transaction = context.BeginTransaction(IsolationLevel.ReadCommitted)) 
    {
        var task = await context.DuplicateElementStartAsync(transaction, sessionId).ConfigureAwait(false);
    }
}

...

public async Task<int> DuplicateElementStartAsync(DbContextTransaction transaction, string sessionId)
{
    int newTaskId;
    var mss = this.Database.Connection as SqlConnection;

    using (var cmd = new SqlCommand()) 
    {
        cmd.Connection = mss;
        cmd.CommandText = "DUPLICATE_ELEMENT_START";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandTimeout = ProgramEnvironment.StoredProcedureTimeout;
        cmd.Transaction = transaction.UnderlyingTransaction as SqlTransaction;

        var mparam0 = cmd.Parameters.Add("session", SqlDbType.NVarChar);
        mparam0.Value = sessionId;
        mparam0.Direction = ParameterDirection.Input;

        var mparam1 = cmd.Parameters.Add("new_task_id", SqlDbType.Int);
        mparam1.Direction = ParameterDirection.Output;

        if (mss.State != ConnectionState.Open) {
            await mss.OpenAsync().ConfigureAwait(false);;
        }

        await cmd.ExecuteNonQueryAsync().ConfigureAwait(false);
        newTaskId = (int) mparam1.Value;

        mss.Close();
    }

    return newTaskId;
}
使用(var context=new MyDbContext())
{
使用(var事务=context.BeginTransaction(IsolationLevel.ReadCommitted))
{
var task=await context.DuplicateElementStartAsync(事务,会话ID).ConfigureAwait(false);
}
}
...
公共异步任务DuplicateElementStartAsync(DbContextTransaction事务,字符串sessionId)
{
纽塔斯基德;
var mss=this.Database.Connection作为SqlConnection;
使用(var cmd=new SqlCommand())
{
cmd.Connection=mss;
cmd.CommandText=“复制元素开始”;
cmd.CommandType=CommandType.storedProcess;
cmd.CommandTimeout=ProgramEnvironment.StoredProcedureTimeout;
cmd.Transaction=Transaction.underyingTransaction作为SqlTransaction;
var mparam0=cmd.Parameters.Add(“session”,SqlDbType.NVarChar);
mparam0.Value=sessionId;
mparam0.Direction=参数Direction.Input;
var mparam1=cmd.Parameters.Add(“new\u task\u id”,SqlDbType.Int);
mparam1.Direction=参数Direction.Output;
如果(mss.State!=连接状态打开){
wait mss.OpenAsync().configurewait(false);;
}
wait cmd.ExecuteNonQueryAsync().ConfigureWait(false);
newTaskId=(int)mparam1.Value;
mss.Close();
}
返回newTaskId;
}
调用存储过程时,是否必须调用
transaction.Commit()
,如果出现问题,是否调用
transaction.Rollback()
,或者这些调用对存储过程不是必需的


目前我不确定,如果有任何提示,我将不胜感激。

您可以随时使用EF的交易。但是,如果您选择不这样做,EF将在内部处理。如果您在自己的C代码中创建了
SqlTransaction
,那么我建议您进行检查,然后是的,您必须调用
.Commit()
.Rollback()
来完成事务。@marc_s:这意味着,在上面的代码示例中,我必须添加try/catch和
.Commit()
.Rollback()
?这是我真正的问题,我不确定。是的,没错。。。