C# Linq-to-Sql - DataContext是否应使用IDisposable进行处理

29

我有几个处理数据库的方法,它们都以调用...开始

FaierDbDataContext db = new FaierDbDataContext();

由于 Linq2Sql DataContext 对象实现了 IDisposable 接口,因此是否应该使用 "using" 呢?

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

使用其中一种方式会有什么影响?


9
另外,对于使用LINQ的人来说,你不应该在数据模型类中保留数据上下文的实例变量。相反,在每次需要时在方法中声明一个。 - mmcdole
1个回答

30
与大多数实现IDisposable接口的类型不同,DataContext在大多数情况下并不需要释放。我询问了Matt Warren关于这个设计决策的原因,他的回答如下: 我们实现IDisposable有几个原因: 1.如果应用程序逻辑需要在DataContext预期被使用或有效之后仍然持有一个实体,则可以通过调用Dispose来强制执行该合同。该实体中的延迟加载器仍将引用DataContext,并且如果任何代码尝试导航延迟属性,则会尝试使用它。这些尝试将失败。Dispose还会强制DataContext清除其已物化实体的缓存,以便单个缓存实体不会意外地保持所有通过该DataContext物化的实体的存在,否则将导致看起来像内存泄漏的问题。 2.自动关闭DataContext连接的逻辑可能会被欺骗而保持连接处于打开状态。DataContext依赖于应用程序代码枚举查询的所有结果,因为到达结果集的末尾会触发连接关闭。如果应用程序使用IEnumerable的MoveNext方法而不是C#或VB中的foreach语句,则可以过早退出枚举。如果您的应用程序遇到连接未关闭的问题,并且怀疑自动关闭行为无法正常工作,则可以使用Dispose模式作为解决方法。
来自source

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接