在using语句关闭它之后,EF Core上下文打开连接

时间:2019-06-17 20:06:14

标签: c# entity-framework-core ef-core-2.2

在.NET Core Web API应用程序中,我在必须运行一些原始sql的函数中使用ef core,然后当我尝试在原始sql之后使用上下文时,它将失败。

上下文从控制器传递到逻辑文件(实际业务 代码)是私有只读 我尝试再次打开连接,但是失败。

DbConnection conn = _context.Database.GetDbConnection();
using (conn)
{
   await conn.OpenAsync();
   using (DbCommand cmd = conn.CreateCommand())
   {
      //Raw SQL                
   }
}
Table1 t1 = await _context.Table1
      .Where(i => i.id == 1)
      .SingleOrDefaultAsync();

一切正常,直到应用程序进入Table1 t1行,然后我得到错误消息

我得到的错误是

InvalidOperationException: The ConnectionString property has not been initialized. System.Data.SqlClient.SqlConnection.PermissionDemand()

编辑

我想问的是有一种最佳实践方法来运行原始SQL,该SQL返回未映射到实体的数据,然后继续使用EF Core。另外有时候我的原始SQL只返回字符串或十进制值

编辑#2

感谢您的帮助,我将使用由 Ivan Stoev

更新后的工作代码

DbConnection conn = _context.Database.GetDbConnection();
await context.Database.OpenConnectionAsync();
using (DbCommand cmd = conn.CreateCommand())
{
   //Raw SQL                
}
context.Database.CloseConnection();
Table1 t1 = await _context.Table1
      .Where(i => i.id == 1)
      .SingleOrDefaultAsync();

1 个答案:

答案 0 :(得分:1)

您是using的连接,它调用Dispose,并在using块的末尾关闭该连接。完全不需要using,只需将其删除即可。但是,似乎您正在尝试在数据库上运行原始SQL命令,EF Core已内置此功能,例如:

await _context.Database.ExecuteSqlCommandAsync("DELETE FROM SomeTable");

还有FromSql个特定于DbSet的方法。