Entity Framework + Репозиторий + Единица работы - PullRequest
15 голосов
/ 04 января 2012

Я подумываю начать новый проект с использованием 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)

Я использую первый (часть 1, часть 2 и часть 3). Они очень похожи.

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

Ответы [ 2 ]

32 голосов
/ 04 января 2012

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

Во-первых, чтобы получить некоторую правильную терминолой. 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();

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

1 голос
/ 04 января 2012

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

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

...