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

Kor*_*tak 27 datacontext idisposable linq-to-sql

我有几种处理DB的方法,所有这些方法都是从调用开始的

FaierDbDataContext db = new FaierDbDataContext();
Run Code Online (Sandbox Code Playgroud)

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

using (FaierDbDataContext db = new FaierDbDataContext()) {
    // use db here
}
Run Code Online (Sandbox Code Playgroud)

以这种或那种方式使用它有什么含义?

Sad*_*egh 29

与大多数实现IDisposable的类型不同,DataContext并不需要处理 - 至少在大多数情况下不需要.我向Matt Warren询问了这个设计决定,以下是他的回答:

我们实现IDisposable有几个原因:

  • 如果应用程序逻辑需要保留超出预期使用DataContext或有效的实体,则可以通过调用Dispose来强制执行该合同.该实体中的延迟加载器仍将引用DataContext,并且如果任何代码尝试导航延迟属性,则会尝试使用它.这些尝试将失败.Dispose还强制DataContext转储其物化实体的缓存,以便单个缓存实体不会意外地保持通过该DataContext实现的所有实体,否则会导致看起来像是内存泄漏.
  • 可以欺骗自动关闭DataContext连接的逻辑,使连接保持打开状态.DataContext依赖于枚举查询的所有结果的应用程序代码,因为到结果集的末尾会触发连接关闭.如果应用程序使用IEnumerable的MoveNext方法而不是C#或VB中的foreach语句,则可以提前退出枚举.如果您的应用程序遇到连接未关闭的问题,并且您怀疑自动关闭行为不起作用,则可以使用Dispose模式作为解决方法.

来自消息来源