无法 GetActiveTransaction

Could not GetActiveTransaction

我需要在我的应用服务中调用存储过程。我正在按照此 tutorial 创建自定义存储库。但是我找不到Context.Database

代码如下:

[UnitOfWork]
public virtual async Task<List<string>> GetUserNames()
{
    EnsureConnectionOpen();

    using (var command = CreateCommand("GetUsernames", CommandType.storedProcedure))
    {
        using (var dataReader = await command.ExecuteReaderAsync())
        {
            var result = new List<string>();

            while (dataReader.Read())
            {
                result.Add(dataReader["UserName"].ToString());
            }

            return result;
        }
    }
}

什么是 Context.Database 以及如何使用它?

我的申请是 MVC .Net4.6.1

更新 1

我已经通过继承MyApplicationRepositoryBase解决了这个问题。

现在我在尝试 GetActiveTransaction 时遇到了一个新问题。我对此一无所知。我能做什么?

代码如下:

private DbTransaction GetActiveTransaction()
{
    return (DbTransaction)_transactionProvider.GetActiveTransaction(new ActiveTransactionProviderArgs
    {
        {"ContextType", typeof(MyDbContext) },
        {"MultiTenancySide", MultiTenancySide }
    });
}

这是错误日志:

System.NullReferenceException: Object reference not set to an instance of an object.  
at Abp.EntityFramework.EfActiveTransactionProvider.GetActiveTransaction(ActiveTransactionProviderArgs args) in D:\Github\aspnetboilerplate\src\Abp.EntityFramework\EntityFramework\EfActiveTransactionProvider.cs:line 21

更新 2

我试图注释掉 command.Transaction 并且成功了:

private DbCommand CreateCommand(string commandText, CommandType commandType, params SqlParameter[] parameters)
{
    var command = Context.Database.GetDbConnection().CreateCommand();

    command.CommandText = commandText;
    command.CommandType = commandType;
    // command.Transaction = GetActiveTransaction();

    foreach (var parameter in parameters)
    {
        command.Parameters.Add(parameter);
    }

    return command;
}

我仍然需要将我的代码放在事务下,所以我不想注释掉这一行。我该怎么办?

Now I faced the new issue when trying to get Active Transaction

YourProjectNameDataModulePreInitialize 方法中添加:

Configuration.ReplaceService<IEfTransactionStrategy, DbContextEfTransactionStrategy>(DependencyLifeStyle.Transien‌​t);