在.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();
答案 0 :(得分:1)
您是using
的连接,它调用Dispose
,并在using
块的末尾关闭该连接。完全不需要using
,只需将其删除即可。但是,似乎您正在尝试在数据库上运行原始SQL命令,EF Core已内置此功能,例如:
await _context.Database.ExecuteSqlCommandAsync("DELETE FROM SomeTable");
还有FromSql
个特定于DbSet
的方法。