C#Linq-to-Sql - 应该使用IDisposable处理DataContext

时间:2009-05-04 19:27:26

标签: linq-to-sql datacontext idisposable

我有几种处理数据库的方法,所有这些方法都是通过调用

开始的
FaierDbDataContext db = new FaierDbDataContext();

由于Linq2Sql DataContext对象实现了IDisposable,是否应该与“using”一起使用?

using (FaierDbDataContext db = new FaierDbDataContext()) {
    // use db here
}

以某种方式使用它有什么含义?

1 个答案:

答案 0 :(得分:29)

  

与大多数实施的类型不同   IDisisable,DataContext没有   真的需要处置 - 至少不是   在多数情况下。我问马特沃伦   关于这个设计决定,在这里   是他的回答:

     

我们实施的原因有几个   IDisposable的:

     
      
  • 如果应用程序逻辑需要保持一个实体超越   期望使用DataContext或   有效的,您可以执行该合同   调用Dispose。延期装载机   该实体仍将引用   DataContext并将尝试使用它   如果任何代码试图导航   延期财产。这些尝试   将失败。处置也迫使   DataContext转储其缓存   物化实体使单一   缓存实体不会意外   让所有实体保持活力   通过那个DataContext,它会   否则会导致看起来像是一个   内存泄漏。
  •   
  • 自动关闭DataContext连接的逻辑可以是   欺骗离开连接   打开。 DataContext依赖于   应用程序代码枚举所有   到达后的查询结果   结果集的结尾触发了   连接关闭。如果   应用程序使用IEnumerable   MoveNext方法而不是foreach   在C#或VB中声明,你可以退出   过早的枚举。如果你的   应用程序遇到的问题   连接没有关闭和你   怀疑自动关闭行为   不工作你可以使用Dispose   模式作为一种解决方法。
  •   
来自source