Удалить контекст в EF Generic Repository - PullRequest
1 голос
/ 10 августа 2011

У меня есть следующий общий репозиторий:

public class EFRepository<TEntity, TContext> : IRepository<TEntity, TContext>,    IDisposable
    where TEntity : class
    where TContext : ObjectContext
{

    protected TContext context;

    public EFRepository(TContext context)
    {
        this.context = context;
    }

    //CRUD methods...

    public void Dispose()
    {
        if (null != context)
        {
            context.Dispose();
        }
    }
}

Это класс из бизнес-уровня

 public class UserBLL : BaseBLL<User>
 {

    EFRepository<User, MyEntities> userRepo = null;

    public UserBLL() : base ()
    {
       //Context is created in the consructor of the base class and passed to repository
        userRepo = new EFRepository<User, MyEntities>(Context);
    }
 }

Вот базовый бизнес-класс:

 public class BaseBLL <TEntity> 
        where TEntity : class
    {
        protected MyEntities Context { get; set; }

        public BaseBLL()
        {
            this.Context = DataAccessHelper.Context;
            this.Context.MetadataWorkspace.LoadFromAssembly(typeof(TEntity).Assembly);
        }
    }

В этом проекте, поскольку я создаю экземпляр репозитория в конструкторе бизнес-класса, а не внутри предложения using, метод dispose из репозитория по умолчанию не вызывается.Мой главный вопрос заключается в том, чтобы убедиться, что контекст / репозиторий расположен.

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

Не стесняйтесь комментировать и дизайн в целом.

Ответы [ 2 ]

2 голосов
/ 11 августа 2011

Обертка Dbcontext с помощью UnitOfWork и внутри метода утилизации агрегата UnitOfWork.

Ссылка: http://elegantcode.com/2009/12/15/entity-framework-ef4-generic-repository-and-unit-of-work-prototype/

2 голосов
/ 10 августа 2011

Это совершенно неправильно. Вы создаете контекст вне репозитория, поэтому репозиторий не может быть ответственным за удаление. Слой, в котором строится хранилище для утилизации = BaseBLL, должен быть одноразовым, а верхний слой должен правильно размещать его, когда он больше не нужен.

...