У меня есть визуальное студийное решение с использованием сплошного шаблона. У меня есть IRepository (реализация Crud), IDbFactory (используется репозиторием), IUnitOfWork. У меня также есть службы, которые используют репозитории для создания пользовательских запросов и сложной работы базы данных. Я использую также шаблон IoC с Ninject. В веб-контроллере mvc я использую только службы для доступа к базе данных. Репозиторий получает IDbFactory, который создает контекст EntityFramework. У меня есть некоторые проблемы:Принципы SOLID, шаблон хранилища и кеш EntityFramework в Asp Net Mvc
- в службе, когда я должен получить доступ к двум таблицам для присоединиться к ним я должен использовать два хранилища, вызывая метод GETALL() обоих из них. В этом случае оба репозитория должны иметь один и тот же контекст EntityFramework.
- Предыдущий случай указывает мне, что DbContext должен использоваться всеми репозиториями, поэтому я могу присоединиться к IQueryables в службе из разных репозиториев.
- Для достижения этой цели я сконфигурирован в контейнере IoC, DbContext в однопользовательском режиме. Таким образом, каждый репозиторий имеет один и тот же DbContext.
- Проблема с этим решением заключается в том, что у DbContext есть кеш. Таким образом, когда внешний процесс (отличный от веб-проекта) меняет мои данные, DbContext этого не понимает, и веб-проект иногда не показывает реальных данных.
- Я прочитал о уничтожить DbContext в каждом вызове хранилища, но я не могу это сделать, потому что каждый репозиторий должен использовать тот же DbContext
я там что-то не так с моей структурой проекта? Это то, что я должен исправить в слое репозитория? Что я делаю? Проект находится в стадии разработки, поэтому я могу изменить архитектуру доступа к данным. Мне нравится использовать IQueryables в контроллере, так что пользователи фильтруют в сетках данных производят sql-запросы.
CodeReview предлагает лучший форум для этих типов вопросов. Например: http://codereview.stackexchange.com/questions/11785/ef-code-first-with-repository-unitofwork-and-dbcontextfactory –
Это классический пример того, почему создание IRepository обычно является пустой тратой времени. EF уже реализует репозиторий и единицу работы и абстрагирует db, так что теперь вы сбросили еще один слой абстракции сверху, чтобы достичь чего? Подождите, пока вы не начнете сохранять вещи в одном репозитории, и это сохраняет изменения в другом, потому что объекты привязаны к одному и тому же контексту. Если вы используете что-то вроде веб-сайта или службы, вы можете продлить срок службы DbContext на каждый запрос, но IRepository, как правило, больше проблем, чем его ценность, – Mant101
еще одна проблема заключается в том, что ваш DbContext является синглом. Это означает, что каждый пользователь запускает тот же DbContext. ломает неотъемлемую часть работы в DBC-тексте. вы хотите создать dbcontext для каждой единицы работы. – Fran