你如何检查开放的实体框架连接

时间:2014-08-21 22:55:46

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

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

鉴于以下内容:

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

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

编辑:我已经放置了context.Dispose();在使用块内。这就是我想表现出来的方式。现在它将编译。

1 个答案:

答案 0 :(得分:1)

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

ConnectionState枚举的值为:

  • 已损坏与数据源的连接已断开。只有在打开连接后才会发生这种情况。可以关闭此状态下的连接,然后重新打开。 (此值保留给产品的未来版本。)
  • 已关闭连接已关闭。
  • 连接连接对象正在连接数据源。
  • 执行连接对象正在执行命令。 (此值保留给产品的未来版本。)
  • 获取连接对象正在检索数据。 (此值保留给产品的未来版本。)
  • 打开连接已打开。

MSDN Connection State

然而,仅仅在DbContext.Database上执行get实际上可以打开连接。你最好相信使用包装器来正确处理你的上下文,而不是再次调用context.Dispose(),因为微软的代码可能已经被测试的程度远大于你的或者我的。

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

context.Close();

哪个

  

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

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

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