Entity Framework DbContext с запросом
Возможно ли в среде Entitiy фильтровать наборы данных объекта при инициализации DbContext?
У меня следующая проблема: я хочу прочитать производственные данные из базы данных нашей системы ERP. Все наши отделы сохраняют свои данные в одной таблице, в которой есть поле для отдела, которому принадлежат данные. Сейчас я разрабатываю программное обеспечение только для одного конкретного отдела. Конечно, я мог прочитать все данные в DbSet, а затем запросить только наборы данных этого отдела в моем коде приложения, например так:
Dim test As New DB.ModelProd()
Dim cl As New List(Of DB.Charge)
cl = test.Charges.ToList().Where(Function(ch) ch.Company = 3 And ch.ChargeId IsNot Nothing).ToList()
'do something with cl
Но так как это приложение только для одного отдела, я не хочу читать и трогать данные других, которые я никогда не буду использовать. Также я хотел бы скрыть эту деталь от приложения, так как она подвержена ошибкам (не забудьте отфильтровать данные перед использованием и т. Д.).
Итак, как лучше это решить?
С наилучшими пожеланиями, Рональд
2 ответа
Там не "лучший" способ - но вот несколько вариантов:
- Внедрить весь доступ с помощью хранимых процедур, требуя идентификатор отдела при каждом вызове
- Создайте репозиторий вокруг вашего контекста, который генерирует запросы и добавляет фильтр отдела
Использование репозитория, вероятно, является наиболее идиоматическим способом в многоуровневой системе. Использование хранимых процедур будет более безопасным, поскольку вы можете предоставить доступ только к процедурам и запретить кому-либо использовать контекст напрямую или запрашивать базу данных, не проходя через них, но это усложняет программирование (вы не сможете свободно использовать Linq запросить базу данных - только через хранимые процедуры)
Реализуйте IDbCommandTreeInterceptor и измените DbCommandTree, сгенерированный EF. Вы можете найти более подробную информацию о реальных шагах в следующем сообщении в блоге.