Entity Framework + репозиторий + единица работы

Я собираюсь начать новый проект с использованием EF 4 и пройти через некоторые статьи, я нашел несколько статей об EF с шаблоном репозитория и единицей работы

(http://tdryan.blogspot.com/2011/03/another-entity-framework-4-repository_15.html и http://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx)

Я использую первый (part1, part2 и part3). Они очень похожи.

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

Ответы

Ответ 1

Ваш вопрос не глуп! Начало работы с UnitOfWork и шаблонами Repository занимает некоторое время.

Во-первых, чтобы получить некоторую терминологию права. A UnitOfWork инкапсулирует набор действий и группирует их вместе. Таким образом, вы можете, например, создать клиента, продукт и соответствующий порядок в одной логической группе.

A Repository предоставляет вам единую точку доступа к объектам, и большую часть времени имеет некоторые конкретные методы для извлечения данных.

Несколько репозиториев могут использоваться в одной транзакции, поэтому они разделяют UnitOfWork.

В приведенном выше примере файлы T4 создают несколько интерфейсов Repository. Один из них - только для чтения с методами для выбора сущностей, а другой Repository имеет методы типа Add и Delete.

Итак, если вы хотите добавить объект, вам нужно сначала построить UnitOfWork, а затем создать экземпляр Repository для типа сущности, с которым вы работаете (CustomerRepository или ProductRepository). Затем вы можете использовать метод Add для добавления объектов в Repository. Когда вы закончите работу с вашими репозиториями, вы должны вызвать UnitOfWork.Commit(), чтобы сохранить изменения в базе данных.

IUnitOfWork unitOfWork = new EFUnitOfWork();

IRepository<Customer> customerRepository = new CustomerEFRepository(unitOfWork);

Customer c = new Customer();

// init customer

customerRepository.Add(c);
unitOfWork.Commit();

В приведенном выше примере используется Injection Dependency с StructureMap. Это целая другая тема, но это означает, что вы не создаете напрямую UnitOfWork и Repository, а вводите их в свой код, используя конфигурацию, которую вы установили.

Ответ 2

Если ваш проект - это web, создайте обработчик, который запускает транзакцию по запросу и завершает ее на последнем шаге.

Я думаю, что более простой пример можно найти здесь: https://github.com/ayende/CourseSampleApp Также вы можете найти другие образцы на nhibernate, которые могут удовлетворить ваши потребности.