首页 > 解决方案 > 如何安全地使用 EF Core Context 的 DBConnection 对象

问题描述

出于某种原因,我想获取 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
}

当这个方法完成后,我想在另一个方法中使用 DBContext 对象。然后 DBContext 对象因InvalidOperationException出错:连接字符串属性尚未初始化

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

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

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

var conn = context.Database.GetDbConnection();
using var cmd = conn.CreateCommand();
// something just the same as above

一切都好。

如果 DBContext 对象有其他事情要做,我可以在使用 DBConnection 对象后不释放它吗?

这安全吗?

顺便说一句,DBContext 对象由using.

标签: c#entity-framework

解决方案


如果 DBContext 对象有其他事情要做,我可以在使用 DBConnection 对象后不释放它吗?

这安全吗?

这是正确的做法,而且是安全的。不用担心DbConnection,只要DbContext处理它,它就会关闭并DbConnection为您处理相关的。


推荐阅读