#c# #entity-framework-6
#c# #entity-framework-6
Вопрос:
Итак, я пишу программу и получаю свои данные, используя EF 6.
В принципе, я думаю, что самым простым подходом было бы иметь один класс, подобный этому:
public class DataRetriever
{
public List<TEntity> GetAll<TEntity>() where TEntity : class
{
using (var Db = new Entity())
{
return Db.Set<TEntity>().ToList();
}
}
}
Итак, вам нужно начать создавать другие классы на основе указания того, какие данные вы хотите собирать. Допустим, у меня есть список карнавальных аттракционов, и один из способов — получить одну поездку или что-то в этом роде. ИТАК, тогда у меня было бы следующее:
public class SelectedRide
{
int RideId { get; set; }
string RideName { get; set; }
string DomValue { get; set; }
public SelectedRide(DataRetriever Retriever)
{
var Records = Retriever.GetAll<vwRideList>();
var Record = from x in Records
where x.RideId == RideId
select x;
RideName = Record.Single().RideName;
DomValue = Record.Single().DomValue;
}
}
Идентификатор поездки — это идентификатор.
Итак, тогда можно было бы сказать, что если бы у другого класса, скажем, у нас было несколько парков, где были аттракционы, могло бы быть public class SelectedPark
, что у него была бы та же логика, но в Retriever.GetAll<vwParkList>();
списке аттракционов теперь есть список парков. И так далее.
Я не могу сказать, быстро ли это выйдет из-под контроля, если я скажу, что было 50 отдельных типов извлечения, которые нужно было выполнить. Конечно, я не буду, поскольку знаю общий объем этой программы, но ЧТО, ЕСЛИ.
Я также видел такие вещи, как шаблон repo, но я не могу сказать, является ли это пустой тратой времени или нет. Я не могу сказать, что я получаю от этого. Это, казалось, делало его достаточно общим, чтобы я не писал контекст в миллионе разных мест.
Комментарии:
1. Шаблон репозитория с Get, GetById, Insert, Update, Delete кажется достаточным для наиболее общих операций CRUD. GetById, в частности, может быть применим в общем случае, если классы сущностей соответствуют базовому интерфейсу (например, поле ID называется «ID», которым можно управлять в ваших моделях).
2. @AnthonyPegram Понял, я думаю, тогда мне нужно больше прочитать о шаблоне, потому что я все еще теряюсь, как, если мне все еще придется в конечном итоге вернуться к своим свойствам, то в какой-то момент, где-то, не сталкиваюсь ли я с аналогичной проблемой, связанной с попытками оставаться универсальным, и затем, в конце концов, я все еще пытаюсь увидеть экономию. Может быть наивным, опять же, мне нужно вернуться и посмотреть на шаблон.
3. @MZawg, шаблон репозитория в сочетании с EntityFramework является антишаблоном, EntityFramework уже является репозиторием, что вам действительно нужно, так это просто универсальная база сервисов, которая обрабатывает ваши операции CRUD, Кроме того, в любое время, когда я вижу ` return Db.Set<TEntity>() . ToList();` это большой недостаток, это заставит вас материализовать все данные перед фильтрацией.
4. @MZawg У меня есть только проприетарный код, но я могу дать вам краткое изложение. Есть базовый сервис, который обрабатывает CRUD. Если вам нужно получить другую сущность, например, если в парке есть скамейки. Затем вы создаете другой сервис для рабочих столов и т.д. Если вам нужно отфильтровать ваши парки, что, похоже, является частью вашей проблемы. Тогда вам придется вручную реализовать эти функции в классе ИЛИ вы можете быть ленивым, как я, и просто добавить модули динамической фильтрации, такие как ODATA
5. Да, вам либо нужно использовать какую-то динамическую фильтрацию, либо в конечном итоге вам придется написать функцию, которая фильтрует данные по определенным полям, например, пользователь хочет найти все парки, в которых есть пруд и т. Д