【问题标题】:EF Core context open connection after a using statement closes itEF Core 上下文在 using 语句关闭连接后打开连接
【发布时间】:2019-06-19 02:09:44
【问题描述】:

在一个 .NET core web api 应用程序中,我在一个函数中使用 ef core,我必须运行一些原始 sql,然后当我尝试在原始 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,返回未映射到实体的数据,然后继续使用 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();

【问题讨论】:

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


【解决方案1】:

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

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

还有一些FromSql 特定于DbSets 的方法。

【讨论】:

  • 只有在语句成功的情况下才会返回1 or 0 我的原始 SQL 会返回一个仅在此函数中操作且不是实体的表。
  • 不管怎样,您仍然不需要将连接放在 using 块中,让 EF 管理该对象。
  • 不仅不需要,而且绝不能Get 不是 Create,因此调用者不拥有返回的对象以便 Dispose 它。
  • 好的,一旦 API 请求完成,EF 将关闭连接我不知道,所以我可以使用 ADO.NET 打开连接,EF 将关闭连接?谢谢(你的)信息。我来自 .NET 3.5 应用程序,第一次使用 EF Core
  • 允许手动打开/关闭连接,例如: _context.Database.OpenConnection();_context.Database.CloseConnection();GetDbConnection() 的存在仅允许创建外部 DbCommands,如 OP 示例中所示。只是不要Dispose它:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
  • 1970-01-01
  • 2020-01-06
相关资源
最近更新 更多