gpt4 book ai didi

c# - .NET Core EF,清理 SqlConnection.CreateCommand

转载 作者:行者123 更新时间:2023-12-03 18:05:30 25 4
gpt4 key购买 nike

我正在使用 .NET Core DI 来获取 DbContext 并且在我的逻辑中,我还需要在 DB 上执行原始 SQL 命令,因此为此我正在创建 DbCommand 来执行这样的 SQL(只是一个示例查询,实际的查询有点复杂,所以为简单起见,此处不写):

public string GetId()
{
var cmd = _context.Database.GetDbConnection().CreateCommand();

bool isOpen = cmd.Connection.State == ConnectionState.Open;
if (!isOpen)
{
cmd.Connection.Open();
}

cmd.CommandText = "Select TOP 1 ID from ABC;";
var result = (string)cmd.ExecuteScalar();

if (isOpen)
{
cmd.Connection.Close();
}

return result;
}

我的问题是,我在 DbContext 上使用 GetDbConnection()CreateCommand(),所以我是否需要明确处理任何这些命令的结果(或将它们包含在 using 语句中)?

还有用于检查 if 是否需要 cmd.Connection.StateConnectionState.Open 块,如果 DI 提供 DbContext,该连接是否已经打开?

顺便说一句,如果重要的话,我们正在使用 AddDbContextPool 注册 DbContext 以启用 DbContext 池。

最佳答案

My question here is, that I am using GetDbConnection() and CreateCommand() on DbContext, so Do I need to explicitly dispose result of any of those commands(or enclose those in using statement)?



这些是不同的,后者的答案是肯定的,前者的答案是否定的。

您只需要遵循简单的原则 - 分配资源的代码负责清理它。
GetDbConnection(如单词 Get 所示)不创建 DbConnection 对象,而是返回 DbContext 实例在其生命周期内创建和使用的对象。在这种情况下, DbContext 拥有 DbConnection ,因此您不应处置该对象(这样做可能会破坏所有者功能)。

另一方面, CreateCommand 确实创建了新的 DbCommand 对象,所以现在您的代码拥有它并负责在不再需要时处理它。

同样的原则适用于 Open/ Close 。同样,您的代码不拥有 DbConnection 对象,因此您必须将其保留在检索它时的状态。 EF Core 在处理需要打开连接的命令时在内部执行此操作 - 在开始时打开它,完成后关闭它。除非它是从外部打开的,在这种情况下他们什么都不做。这正是上述原则 - 如果您的代码执行 Open ,那么它应该执行 Close ,否则什么都不做。

所以有问题的代码应该是这样的(请注意,您的代码的关闭逻辑中存在一个错误 - 调用 Close 的条件应该是 !isOpen ,与用于 Open 调用的条件相同):
public string GetId()
{
using (var cmd = _context.Database.GetDbConnection().CreateCommand())
{
bool wasOpen = cmd.Connection.State == ConnectionState.Open;
if (!wasOpen) cmd.Connection.Open();
try
{
cmd.CommandText = "Select TOP 1 ID from ABC;";
var result = (string)cmd.ExecuteScalar();
return result;
}
finally
{
if (!wasOpen) cmd.Connection.Close();
}
}
}

关于c# - .NET Core EF,清理 SqlConnection.CreateCommand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57645042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com