2

我使用ASP.NET 5/ASP.NET CoreEF7/EF Core“的ConnectionString尚未初始化”错误调用两个不同的版本库

我有一个使用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 = { “ConnectionString属性尚未初始化。”}

我明确注释掉了connection.Close();行但它仍然给了我相同的connectiontring属性还没有被初始化的错误信息。

回答

1

在我的代码以上我改变

using (var connection = (SqlConnection)_db.Database.GetDbConnection()) 

var connection = (SqlConnection)_db.Database.GetDbConnection(); 

,然后我不关闭该使用端部支架会做的连接。

+0

你是我的英雄! –

1

问题不在于拨打connection.Close(),而是拨打connection.Dispose()呼叫,该呼叫在退出using区块时被调用。在我的情况下,

var connection = (SqlConnection)_db.Database.GetDbConnection(); 
try { 
    // db stuff 
} 
finally { 
    connection.Close(); 
} 

工作正常更换 using (var connection = (SqlConnection)_db.Database.GetDbConnection()),但我还是明白到底发生了什么。看起来像dispose为用于获取DbConnection的数据库对象内部创建一个incosistent状态。

相关问题