我正在使用ASP.NET 5
/ ASP.NET Core
EF7
/ EF Core
我有以下使用ASP.NET 5依赖注入的存储库类
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();
}
}
从我的ASP.NET MVC控制器调用,我可以成功调用搜索并获取数据。
public class PersonController : Controller
{
private IPersonRepository _personRepository;
public PersonController (IPersonRepository personRepository){
_personRepository= personRepository;
}
public async Task<IActionResult> PersonAction()
{
var result = await _personRepository.Search();
}
}
然而,当我在此工作存储库调用之前调用另一个存储库中的存储过程的另一个存储库方法调用时,会发生奇怪的事情。
存储过程
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;
}
行动方法:
public async Task<IActionResult> PersonAction()
{
var list = await _anotherRepository.GetList();
var result = await _personRepository.Search();
}
突然await _personRepository.Search();
抛出异常
InnerException = {&#34; ConnectionString属性尚未初始化。&#34;}
我明确注释掉connection.Close();
行,但它仍然给我相同的connectionstring属性尚未初始化的错误消息。
答案 0 :(得分:4)
问题不在于调用connection.Close()
,而是调用connection.Dispose()
调用,调用在退出using
块时调用。在我的情况下,替换
using (var connection = (SqlConnection)_db.Database.GetDbConnection())
与
var connection = (SqlConnection)_db.Database.GetDbConnection();
try {
// db stuff
}
finally {
connection.Close();
}
工作正常,但我仍然明白实际发生了什么。看起来dispose为Database对象内部创建了一个不存在的状态,用于获取DbConnection。
答案 1 :(得分:2)
在上面的代码中,我更改了
using (var connection = (SqlConnection)_db.Database.GetDbConnection())
到
var connection = (SqlConnection)_db.Database.GetDbConnection();
然后我不关闭使用端括号的连接。