Нет необходимости размещать DataContext/ObjectContext в EF?

Альбахари пишет в "С# 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?

Ответ 1

Вы всегда должны вызывать dispose, если класс предоставляет его. В заявлении утверждается, что EF и L2S закрывают соединение, когда они завершают работу, так как я знаю, что инструкция верна, но в то же время команда ADO.NET также закрывает соединение в методе Dispose, поэтому, возможно, есть ситуации, когда соединение не закрывается.

Ответ 2

Я работаю над EF 4.0 ObjectContext (да, я знаю...). Я закончил просмотр кода в DotPeek, и в распоряжении только нулевые ссылки на соединение и несколько других вещей в классе ObjectContext.

Когда создается соединение (также найденное через DotPeek), он возвращает существующий экземпляр. Если строка подключения изменена, она обновит строку подключения для всех экземпляров.

Это было мое занятие по крайней мере. Нужно смотреть глубже, но на первый взгляд кажется, что вы можете избежать неприятностей.