【问题标题】:No need to dispose DataContext/ObjectContext in EF?不需要在 EF 中处理 DataContext/ObjectContext?
【发布时间】:2012-06-05 12:40:45
【问题描述】:

Albahari 在“c# 4.0 in a nutshell”中写道:

> 尽管 DataContext/ObjectContext 实现了 IDisposable,但您可以(通常) 在不处理实例的情况下离开。 Disposing 强制上下文的连接 处置——但这通常是不必要的,因为 L2S 和 EF 关闭了连接 每当您完成从查询中检索结果时自动

这感觉不对,如果您不处理 IDisposable 的东西,FxCop 也会抱怨。

我有以下存储库代码:

    public abstract class Repository<TEntity> : IRepository<TEntity> where TEntity : class
    { ...
        public void Add(TEntity entity)
    {
        using (var dbContext = this.UnityContainer.Resolve<DbContext>())
        {
            dbContext.Set<TEntity>().Add(entity);
            dbContext.SaveChanges();
        }
    }

    ...

    public virtual IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> expression)
    {
       using (var dbContext = this.UnityContainer.Resolve<DbContext>())
       {
           return dbContext.Set<TEntity>().Where(expression).ToList().AsEnumerable();
       }
    }
    ...

注意:我不返回 IQueryable - 延迟加载不应该发挥作用。 Resolve DbContext 配置为 PerResolveLifetimeManager。

这种方法可以吗,还是我需要根据 Albaharis 的描述重新考虑?

【问题讨论】:

    标签: entity-framework repository repository-pattern idisposable


    【解决方案1】:

    如果类暴露了它,你应该总是调用 dispose。该声明声称 EF 和 L2S 在完成操作时关闭连接 - 我知道该声明是正确的,但同时 ADO.NET 团队也在Dispose 方法中关闭连接,因此可能存在连接未关闭的情况。

    【讨论】:

    • "如果类暴露了它,你应该总是调用 dispose。" -- 不,并非总是如此,例如Do I need to dispose of Tasks? 如果Dispose 没有做任何感兴趣的事情并且 Dispose 将来不会更新,则您不需要致电Dispose做任何感兴趣的事情。我无法判断ObjectContextDispose 是否会做或可以做任何有用的事情,所以我无法回答这个问题,但我不同意你的推理。 “所以可能存在连接未关闭的情况”-如果您使用正确,则不会。
    • 谢谢 Ladislav - 我不喜欢你可以放弃 Dispose on Disposables 的想法,但在某些情况下似乎是这样。
    • @hvd:在这种情况下,它只是滥用 Disposable 模式和另一种核心 .NET 架构被破坏的情况。
    • 您应该始终在上下文中调用 Dispose。在某些情况下它可能什么都不做,在其他情况下它会。如果 Dispose 从不做任何事情,那么 EntityConnection.Dispose 中就不会有一堆代码。
    • 我从来没有在上下文中调用过 Disposed 并且它似乎没有导致任何问题,所以我宁愿省略它以避免样板式代码。
    【解决方案2】:

    我正在开发 EF 4.0 ObjectContext(是的,我知道...)。我最终查看了 DotPeek 中的代码,并且 dispose 只是将连接的引用和 ObjectContext 类中的一些其他内容置为空。

    创建连接时(也可以通过 DotPeek 找到),它会返回现有实例。如果连接字符串发生更改,它将更新所有实例的连接字符串。

    至少这是我的看法。需要深入研究,但乍一看,您似乎可以侥幸逃脱。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    相关资源
    最近更新 更多