【问题标题】:how do you check open entity framework connections你如何检查开放实体框架连接
【发布时间】:2014-08-21 22:55:46
【问题描述】:

在带有 VS2012/VS2013 的实体框架 5 中。 C#

鉴于以下情况:

using (modelEntities context = new modelEntities())
{
    //do stuff
    context.Dispose();
}

假设 using 语句自己调用 Dispose()。我仍然在连接上调用 dispose 只是为了确保它被关闭。有没有办法检查我在 localhost 上运行的 Visual Studio 项目是否有打开的连接?

编辑:我已经放置了 context.Dispose();在 using 块内。这就是我想要展示的方式。现在它将编译。

【问题讨论】:

  • context.Dispose(); 超出范围。这甚至不会编译。另外 - 正如你所说 - using 语句负责调用 Dispose() 本身,所以真的没有必要这样做,这样做也没有用。如果您在整个项目中使用 using 语句,则无需担心连接处于打开状态。

标签: c# .net visual-studio-2012 entity-framework-5 ado.net-entity-data-model


【解决方案1】:

DbContext 具有 IDbConnection 类型的 Database 属性,该属性又具有 System.Data.ConnectionState 类型的 State 属性,它是一个枚举。

ConnectionState 枚举的值是:

  • Broken 与数据源的连接已断开。这只能在打开连接后发生。处于这种状态的连接可能会关闭然后重新打开。 (此值保留用于产品的未来版本。)
  • 已关闭连接已关闭。
  • Connecting 连接对象正在连接到数据源。
  • Executing 连接对象正在执行命令。 (此值保留用于产品的未来版本。)
  • Fetching 连接对象正在检索数据。 (此值保留用于产品的未来版本。)
  • Open 连接已打开。

MSDN Connection State

然而,仅仅在 DbContext.Database 上做一个获取实际上可以打开连接。你最好相信 using 包装器来正确处理你的上下文,而不是再次调用 context.Dispose(),因为微软的代码可能已经被测试到比你或我的代码更大的程度。

如果您绝对必须明确确保连接已关闭,那么您可以覆盖上下文的 Dispose 方法并调用

context.Close();

哪个

关闭与数据库的连接。这是首选的方法 关闭任何打开的连接。

通过在 using 语句之后再次调用 context.Dispose ,您基本上是在与任何阅读您的代码的人沟通,您有/或有您没有实际调试过的问题,并且您只是随机调用清理代码你“希望”有效。

编辑:根据评论,由于范围,这甚至不会编译。我在这方面误读了您的问题,如果您将上下文传递给存储库或作为工作单元的一部分,就像我通常这样做的那样,然后决定使用 using 关闭您的上下文,那么您应该相信它会按照规定进行清理。

【讨论】:

  • 据我记得 DbContext.Dispose() 也会处理连接,因此无需覆盖它。
  • 是的,你是对的。我试图说明的一点是,如果操作真的需要在关闭时等,无论出于何种原因,那将是一个更好的地方,而不是作为上下文之外的东西,即封装。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 2012-03-13
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多