C# 如何使用EF核心上下文';DBS连接对象安全

C# 如何使用EF核心上下文';DBS连接对象安全,c#,entity-framework,C#,Entity Framework,出于某种原因,我想获取DBContext对象的DBConnection对象 因为DBConnection、DBCommand和DBDataReader是一次性的,所以我使用它们如下: public static void Query(DBContext context) { using var conn = context.Database.GetDbConnection(); conn.Open(); using var cmd = conn.CreateCommand

出于某种原因,我想获取DBContext对象的DBConnection对象

因为DBConnection、DBCommand和DBDataReader是一次性的,所以我使用它们如下:

public static void Query(DBContext context)
{
    using var conn = context.Database.GetDbConnection();
    conn.Open();
    using var cmd = conn.CreateCommand();
    // do something
    using var reader = cmd.ExecuteReader();
    // do something
}
var conn = context.Database.GetDbConnection();
using var cmd = conn.CreateCommand();
// something just the same as above
当这个方法完成时,我想在另一个方法中使用DBContext对象。然后DBContext对象出现了InvalidOperationException错误:connectionstring属性尚未初始化

我尝试在引发此异常的下一个方法中获取DBConnection,发现State属性为“Closed”

context.DataBase.GetDbConnection()方法是否每次都返回相同的实例

如果我不在conn对象之前添加using,如下所示:

public static void Query(DBContext context)
{
    using var conn = context.Database.GetDbConnection();
    conn.Open();
    using var cmd = conn.CreateCommand();
    // do something
    using var reader = cmd.ExecuteReader();
    // do something
}
var conn = context.Database.GetDbConnection();
using var cmd = conn.CreateCommand();
// something just the same as above
一切都好

如果DBContext对象还有其他事情要做,我可以在使用DBConnection对象之后不处理它吗

这安全吗

顺便说一下,DBContext对象是由
使用
声明的

在使用DBConnection对象之后,如果 DBContext对象还有其他事情要做吗

这安全吗


这样做是正确的,也是安全的。不要担心
DbConnection
只要
DbContext
被释放,它就会关闭并为您释放相关的
DbConnection

注意:如果您使用的是EF Core 3.0,您可以使用“.FromSqlRaw()”而不是.CreateCommand()

参数化查询可以使用

var result= context.ExampleTable.FromSqlRaw("SELECT * From ExampleTable Where Id= {0}", id).FirstOrDefault();
有关更多详细信息,请参阅