Я не понимаю необходимости использования как ADO.NET, так и EF.Один EF должен делать.
В любом случае, я рекомендую НЕ реализовывать UoW самостоятельно для ADO.NET.Это много работы и ошибок, и, наконец, вы обнаружите, что сделали все это неправильно.Если вы действительно хотите использовать UoW, используйте вместо этого EF (или NHibernate или еще).Зачем изобретать велосипед?Если вы решите реализовать его самостоятельно, вы на самом деле пишете свой собственный ORM, который считается антишаблоном .
Если вы хотите реализовать функцию UPDATE с использованием ADO.NET, тогда вы можете простореализовать метод void Update(TEntity entity);
в вашем IRepository
и вызывать его явно из вызывающего кода.Не включайте IUnitOfWork
, чтобы сделать это автоматически.
Редактировать: Ответы на некоторые ваши комментарии -
Классический ADO.NET ORM не имеетИменно поэтому у меня возникают проблемы с обновлением объектов.
ADO.NET не является ORM.Это простой и основной API для взаимодействия с RDBMS.Все ORM используют его для внутреннего использования.
это также устраняет одну из ключевых целей шаблона репозитория, которая заключается в отделении вашего приложения от любых структур ORM.
Нет, скрытиеORM не является целью репозитория.Абстракция логики базы данных есть.Сделав это, вы можете смоделировать репозиторий, и ваш другой код станет тестируемым.Переключение ORM - довольно редкое решение.Хранилище делает этот процесс простым;конечно.Но все же, это не является обязанностью Репозитория.На самом деле, репозиторий не имеет никакого отношения к ORM или нет.
Шаблон репозитория должен быть реализован для всех из них.
Это может быть;в зависимости от потребностей бизнеса.Полные ORM, такие как EF, сами по себе являются репозиторием.Так что это дизайнерское решение, стоит ли добавить еще одну абстракцию над ним.Некоторые добавляют это;некоторые предпочитают использовать ORM напрямую.Оба подхода имеют свои преимущества и недостатки.
Создание метода обновления некорректно, поскольку ваш репозиторий не должен интересоваться семантикой вашей базы данных.
Вы должны внедрить ORMсебя тогда.Многие ORM с открытым исходным кодом.См. Код Dapper-Contrib на Git Hub.Он поддерживает ограниченное UoW;хорошо начать.Надеюсь, что это может помочь вам.
Я все еще настаиваю (исходя из собственного опыта), чтобы не разрабатывать собственную ORM.