Общий контекст репозитория Entity Framework

Я создаю приложение ASP.NET 4.0 MVC 2 с общим репозиторием на основе это сообщение в блоге.

Я не уверен, что делать с временем существования ObjectContext - вот типичный метод из моего класса репозитория:

public T GetSingle<T>(Func<T, bool> predicate) where T : class
{
    using (MyDbEntities dbEntities = new MyDbEntities())
    {
        return dbEntities.CreateObjectSet<T>().Single(predicate);
    }
}

MyDbEntities - это ObjectContext, созданный Entity Framework 4.

  1. Можно ли вызывать .CreateObjectSet() и создавать / удалять MyDbEntities для каждого HTTP-запроса? Если нет, как я могу сохранить этот объект?
  2. Если другой метод возвращает IEnumerable<MyObject> с использованием аналогичного кода, вызовет ли это неопределенное поведение, если я попытаюсь выполнить операции CRUD за пределами этого метода?

person Alex    schedule 22.09.2010    source источник
comment
может помочь или не помочь, но я задал аналогичный вопрос относительно DI и IDisposable - stackoverflow.com/questions/3665336/   -  person RPM1984    schedule 22.09.2010


Ответы (1)


Да, можно создавать новый контекст объекта для каждого запроса (и, в свою очередь, для вызова CreateObjectSet). Фактически, это предпочтительнее. И, как любой объект, реализующий IDisposable, вы должны быть порядочным гражданином и избавиться от него (что и делает код, приведенный выше). Некоторые люди используют IoC для управления временем жизни своего объектного контекста, привязанного к http-запросу, но в любом случае это недолго.

Что касается второй части вашего вопроса, я думаю, вы спрашиваете, выполняет ли другой метод операцию CRUD с другим экземпляром контекста данных (дайте мне знать, если я неправильно интерпретирую). В этом случае вам необходимо присоединить его к новому контексту данных, который будет выполнять фактическое обновление базы данных. Это прекрасное занятие. Также допустимо использование шаблона «Единица работы».

person Steve Michelotti    schedule 22.09.2010
comment
да, именно то, что я делаю. StuctureMap httpcontextscoped service / repo / datacontext. - person RPM1984; 22.09.2010
comment
Я использую .CreateObjectSet (), потому что не могу получить ссылку на наборы, созданные EF, например dbEntities.Products или dbEntities.Orders. Является ли .CreateObjectSet () единственным способом получить дескриптор одной из этих коллекций? - person Alex; 22.09.2010