Hoang Tran
Hoang Tran

Reputation: 956

Could not GetActiveTransaction

I need to call stored procedure in my App Service. I'm following this tutorial to create a custom repository. But I could not find the Context.Database.

Here is the code:

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

What is the Context.Database and how do I use it?

My application is MVC in .Net4.6.1.

Update 1

I have resolved this issue by inheriting MyApplicationRepositoryBase.

Now I face a new issue when trying to GetActiveTransaction. I don't have any idea about this. What can I do?

Here is the code:

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

Here is the error log:

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

Update 2

I tried to comment out the command.Transaction and it worked:

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

I still need to put my code under a Transaction, so I don't want to comment out this line. What should I do?

Upvotes: 1

Views: 278

Answers (1)

aaron
aaron

Reputation: 43098

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

Add this in PreInitialize method of YourProjectNameDataModule:

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

Upvotes: 4

Related Questions