无需在EF中部署DataContext / ObjectContext?

时间:2012-05-31 09:07:37

标签: entity-framework repository repository-pattern idisposable

Albahari在“简称c#4.0”中写道:

  

>   虽然DataContext / ObjectContext实现了IDisposable,但你可以(通常)   在没有处理实例的情况下离开处置强制上下文的连接   处置 - 但这通常是不必要的,因为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();
       }
    }
    ...

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

这种做法是否正常,或者我是否需要根据Albaharis描述重新考虑这个问题?

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:0)

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

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

这至少是我的看法。需要更深入,但乍一看,似乎你可以逃脱它。