Доступ к Entity Manager в ASP .NET MVC - PullRequest
0 голосов
/ 29 мая 2009

Привет, Попытка разобраться в наилучшем способе предоставления доступа к моему Entity Manager, сохраняя контекст открытым через запрос, чтобы разрешить позднюю загрузку. Я вижу много примеров, таких как:

public class SomeController
{
     MyEntities entities = new MyEntities();
}

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

public static GetEntity(MyEntities entityManager, int id)
{
      return entityManager.Series.FirstOrDefault(s => s.SeriesId == id);
}

Очевидно, я ищу хороший, потокобезопасный способ, чтобы обеспечить entityManager для метода без его передачи. Способ также должен быть модульным, мои предыдущие попытки поместить его в Session не работали для модульных тестов.

Я на самом деле ищу рекомендуемый способ работы с Entity Framework в ASP .NET MVC для приложения уровня предприятия.

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 29 мая 2009

Entity Framework v1.0 выделяется в приложениях Windows Forms, где вы можете использовать контекст объекта сколько угодно. В частности, в asp.net и mvc это немного сложнее. Моим решением было сделать репозитории или менеджеры сущностей более похожими на сервисы, с которыми MVC мог общаться. Я создал своего рода универсальный универсальный базовый репозиторий , который я мог использовать всякий раз, когда мне это нравилось, и просто переставал беспокоиться о том, чтобы сделать это правильно. Я бы старался не оставлять контекст объекта открытым даже на мс дольше, чем это абсолютно необходимо в веб-приложении.

Посмотрите на EF4. Я начал использовать EF в производственной среде, когда он был в бета-версии 0.75 или чем-то подобном, и у меня не было с этим особых проблем, за исключением того, что иногда это была «тяжелая работа».

1 голос
/ 29 мая 2009

Возможно, вы захотите взглянуть на шаблон репозитория (здесь запишите репозитория с Linq to SQL).

Основная идея заключается в том, что вместо создания статического класса вы создаете экземпляр версии репозитория. Вы можете передать свой EntityManager в качестве параметра классу в конструкторе - или, что еще лучше, фабрике, которая может создать ваш EntityManager для класса, чтобы он мог создавать единицу работы для менеджера.

Для MVC я использую базовый класс контроллеров. В этом классе вы можете создать фабрику менеджера сущностей и сделать ее свойством класса, чтобы производные классы имели к нему доступ. Разрешить его вставку из конструктора, но создать с правильным значением по умолчанию, если переданный экземпляр имеет значение null. Всякий раз, когда методу контроллера требуется создать хранилище, он может использовать этот экземпляр для передачи в хранилище, чтобы он мог создать требуемый менеджер.

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

0 голосов
/ 29 мая 2009

Не ленитесь загружать объекты в представлении. Не выполняйте вызовы бизнес-уровня в представлении. Загрузите все сущности, которые представлению понадобятся спереди, в контроллер, вычислите все суммы и средние значения, необходимые представлению, спереди в контроллере и т. Д. В конце концов, для этого и нужен контроллер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...