10

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

> 尽管 DataContext/ObjectContext 实现了 IDisposable,但您(通常)可以在不释放实例的情况下逃脱。释放会强制释放上下文的连接——但这通常是不必要的,因为每当您完成从查询中检索结果时,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 的描述重新考虑?

4

2 回答 2

7

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

于 2012-05-31T09:18:43.950 回答
0

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

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

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

于 2016-10-12T04:31:13.190 回答