Entity Framework, как сделать это более универсальным, чтобы писать меньше кода

#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. Да, вам либо нужно использовать какую-то динамическую фильтрацию, либо в конечном итоге вам придется написать функцию, которая фильтрует данные по определенным полям, например, пользователь хочет найти все парки, в которых есть пруд и т. Д