无需在EF中部署DataContext/ObjectContext?

Vol*_*nem 10 entity-framework idisposable repository repository-pattern

Albahari在"c#4.0简介"中写道:

>尽管DataContext/ObjectContext实现了IDisposable,但您可以(通常)在不处置实例的情况下逃脱.处置强制上下文与dispose的连接 - 但这通常是不必要的,因为只要完成从查询中检索结果,L2S和EF就会自动关闭连接<<

这感觉不对,FxCop也会抱怨,如果你没有放弃IDisposable的东西.

我有以下存储库代码:

    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();
       }
    }
    ...
Run Code Online (Sandbox Code Playgroud)

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

这种方法是正确的还是我需要根据Albaharis描述重新考虑这个问题?

Lad*_*nka 7

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

  • 您应该始终在上下文中调用Dispose.在某些情况下,它可能不会做任何事情,在其他情况下它会.如果Dispose从未做过任何事情,那么EntityConnection.Dispose中就不会有一堆代码. (6认同)
  • "如果上课暴露它,你应该总是召唤出来." - 不,不总是,请参阅[我是否需要处理任务?](http://blogs.msdn.com/b/pfxteam/archive/2012/03/25/10287435.aspx)你不要如果`Dispose`没有任何兴趣*并且*`Dispose`将来不会更新以做任何感兴趣的事情,我需要调用`Dispose`.我无法判断`ObjectContext`的'Dispose`是否有用或者可以做任何有用的事情,所以我对这个问题没有答案,但我不同意你的推理."所以可能存在连接未关闭的情况" - 如果你正确使用它,那就不是了. (2认同)