Использование шаблона репозитория с базой данных EF 4.1. Первый подход

Это возможно?

Есть примеры? Мои поиски пока безрезультатны...

Причина, по которой я использую этот подход, заключается в том, что я должен придерживаться устаревшей базы данных для своего приложения MVC 3, но есть некоторые довольно сложные ассоциации и иерархии наследования, поэтому я хочу, чтобы EF генерировал сопоставления, а не делал это вручную. Я хочу использовать шаблон репозитория для модульного тестирования. Любые советы приветствуются.




Ответы (3)


Ваш поиск станет плодотворным, если вы просто выполните поиск «Шаблон репозитория Entity Framework 4.1» или что-то в этом роде и забудете термин «База данных в первую очередь». Неважно, пишете ли вы свои классы вручную (сначала код) или создаете их с помощью генератора DbContext (сначала база данных/модель). В конце концов, ваш репозиторий будет использовать эти классы. Не существует генератора, который также написал бы для вас значимый репозиторий, кроме DbSets вашей модели, которые являются специализациями общих репозиториев. Вы должны написать его вручную на основе классов модели и потребностей вашего бизнеса.

Таким образом, это не влияет на дизайн репозитория, следуете ли вы подходу Code First или Database/Model First.

О шаблоне репозитория с EF и модульном тестировании я рекомендую прочитать это как предупреждение и отправную точку и перейти по множеству ссылок в этом ответе:

Шаблон репозитория с Entity Framework 4.1 и отношения между родителями и детьми

person Slauma    schedule 07.11.2011
comment
Спасибо, Слаума. Просто чтобы прояснить несколько вещей... Я не ищу что-то для создания моего репозитория, и я могу сделать это сам с помощью множества примеров. Дело в том, что у меня нет времени использовать подход «сначала код» и вручную писать все сопоставления, ассоциации и т. д. для устаревшей базы данных. Вот почему я использую первый подход к базе данных. Чтобы я мог сгенерировать DbContext и использовать его в репозитории. Спасибо за ссылку, она помогла прояснить некоторые заблуждения, которые у меня были. - person empo; 08.11.2011

Вы все еще можете использовать стиль Code-first, если хотите: code-first позволяет вам реконструировать существующую базу данных, чтобы начать работу. Или, если у вас уже есть EDMX, вы можете создать свои классы code-first с помощью шаблона T4 (в комплекте с EF 4.1). Или, опять же, используйте шаблоны T4 для создания POCO и сохраняйте базу данных в первую очередь в качестве стратегии.

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

person Mathieu Leblanc    schedule 09.11.2011

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

Я столкнулся с двумя основными проблемами при использовании репозитория таким образом. Во-первых, у меня возникла проблема с методом Dispose по умолчанию на моих контроллерах. Поскольку я вызывал DbContext в своем репозитории, мне пришлось унаследовать IDisposable и реализовать там метод Dispose. Я использовал это руководство в качестве примера того, что http://csharppulse.blogspot.in/2013/09/learning-mvc-part-6-generic-repository.html

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

person Caffeinius    schedule 06.08.2014