I am using ASP.NET 5 / ASP.NET Core with EF7 / EF Core
I have the following repository class that uses ASP.NET 5's dependency injection
using Microsoft.Data.Entity;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace MyNamespace
{
public class PersonRepository :IPersonRepository
{
private MyDbContext _db;
public MyRepository(MyDbContext db)
{
_db = db;
}
public async Task<IEnumerable<Person>> Search()
{
var table = from p in _db.Persons
select p;
return await table.ToListAsync();
}
}
public interface IPersonRepository
{
Task<IEnumerable<Person>> Search();
}
}
Calling from my ASP.NET MVC controller I can call search successfully and get the data.
public class PersonController : Controller
{
private IPersonRepository _personRepository;
public PersonController (IPersonRepository personRepository){
_personRepository= personRepository;
}
public async Task<IActionResult> PersonAction()
{
var result = await _personRepository.Search();
}
}
However something odd happens when I call another repository method call of a stored proc in another repository before this working repository call.
Stored proc
public async Task<List<sp_GetList_Result>> sp_GetList()
{
const string query = "exec [dbo].[sp_GetList];";
var list = new List<sp_GetList_Result>();
using (var connection = (SqlConnection)_db.Database.GetDbConnection())
{
using (var command = new SqlCommand(query, connection))
{
connection.Open();
using (var reader = await command.ExecuteReaderAsync())
{
while (reader.Read())
{
var row = new sp_GetList_Result();
//populate row
list.Add(row);
}
}
connection.Close();
}
}
return list;
}
Action Method:
public async Task<IActionResult> PersonAction()
{
var list = await _anotherRepository.GetList();
var result = await _personRepository.Search();
}
Suddenly await _personRepository.Search(); throws an exception
InnerException = {"The ConnectionString property has not been initialized."}
I explicitly comment out connection.Close(); line but it still gives me the same connectionstring property has not been initialized error message.
The problem does not lie with calling connection.Close(), but rather with the connection.Dispose() call, which is called when exiting the using block. In my case, replacing
using (var connection = (SqlConnection)_db.Database.GetDbConnection()) with
var connection = (SqlConnection)_db.Database.GetDbConnection();
try {
// db stuff
}
finally {
connection.Close();
}
worked fine, but I am still to understand what actually happens. Looks like the dispose creates an incosistent state for Database object internals that are used for getting the DbConnection.
In my code above I changed
using (var connection = (SqlConnection)_db.Database.GetDbConnection())
to
var connection = (SqlConnection)_db.Database.GetDbConnection();
and then I don't close the connection which the using end bracket would do.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With