【问题标题】:C# Linq-to-Sql - Should DataContext be disposed using IDisposableC# Linq-to-Sql - 是否应使用 IDisposable 处理 DataContext
【发布时间】:2010-10-23 17:20:35
【问题描述】:

我有几种处理 DB 的方法,它们都从调用开始

FaierDbDataContext db = new FaierDbDataContext();

既然Linq2Sql DataContext对象实现了IDisposable,这应该和“using”一起使用吗?

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

以一种或另一种方式使用它有什么影响?

【问题讨论】:

  • 另外,附带说明一下,对于使用 LINQ 的人,您不应该为数据模型类保留数据上下文的实例变量。相反,每次你需要在你的方法中声明一个。

标签: linq-to-sql datacontext idisposable


【解决方案1】:

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

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

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

来自source

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    相关资源
    最近更新 更多