Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 01.03.2018
Сообщений: 54

EF Core и паттерн Репозиторий

21.10.2018, 20:29. Показов 2798. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем возник такой вопрос, есть общий репозиторий реализующий стандартные методы: Get,Insert,Update,Delete,GetAll,
есть так же классы сервиса, которые описывают методы каждой отдельной сущности.(разбито на несколько библиотек).
Если это "примитивные" запросы на добавление удаление объектов из базы данных, то все хорошо работает.
Например методы сервиса:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
   
public IEnumerable<Account> GetAccount()
        {
            return accountRepository.GetAll();
        }
        public Account GetAccount(int id)
        {
            return accountRepository.Get(id);
        }
        public void InsertAccount(Account account)
        {
            accountRepository.Insert(account);
        }
        public void UpdateAccount(Account account)
        {
            accountRepository.Update(account);
        }
        public void DeleteAccount(int id)
        {
            Account account = accountRepository.Get(id);
            accountRepository.Delete(account);
            accountRepository.SaveChanges();
        }
Repository
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
        public IEnumerable<T> GetAll()
        {
            return entities.AsEnumerable();
        }
        public T Get(int id)
        {
            return entities.SingleOrDefault(s => s.Id == id);
        }
        public void Insert(T entity)
        {
            if (entity == null)
            {
                throw new ArgumentNullException("entity");
            }
            entities.Add(entity);
            context.SaveChanges();
        }
        public void Update(T entity)
        {
            if (entity == null)
            {
                throw new ArgumentNullException("entity");
            }
            context.SaveChanges();
        }
        public void Delete(T entity)
        {
            if (entity == null)
            {
                throw new ArgumentNullException("entity");
            }
            entities.Remove(entity);
            context.SaveChanges();
        }
Но теперь предположим, нужно получить данные одной таблицы, и присоединить к другой (стандартный join), после чего сделать выборку(where), и отгрупировать..
Репозиторий общий, для всех объектов бд. Т.е. получается, нужно либо в репозитории создавать кучу методов, либо используя один - getAll, а потом уже средствами C# выполнять все эти действия? Если объектов в бд пару сотен то не страшно, а если их несколько сотен тысяч?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.10.2018, 20:29
Ответы с готовыми решениями:

Паттерн Репозиторий. Суть
Насколько я понимаю суть в том, что репозиторий служит прослойкой между доменом и хранилищем данных(в моем случае это xml файл). Также...

Паттерн репозиторий. Основная концепция
Здравствуйте, единого мнения не нашел касательно паттерна репозиторий. Интересно услышать мнение форумчан, то как у них это реализовано. ...

Модели и паттерн "Репозиторий"
Здравствуйте, уважаемые форумчане. Я новичок в сфере web-программирования и только начал учить mvc. В ходе чтения про orm и репозитории...

5
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,405
22.10.2018, 06:29
makoooo, для этого наследуются от общего репозитория и реализуют дополнительные методы.

Так же, имеет смысл в общем репозитории реализовать методы Get и GetAll принимающие массивы предикатов (для формирования условия выборки через Where) и массивы "путей" (для Include). Это позволит сократить количество методов чтения данных.

Так же, очень фиговой практикой является вызов SaveChanges в репозитории. У вас EF, он умеет в Unit Of Work, этим нужно пользоваться, раз оно есть. Заведите класс DataService, в котором будут репозитории, контекст и метод SaveChanges.

Примерно так:

C#
1
2
3
4
5
6
7
8
9
10
var accountRepo = _dataService.AccountRepository;
 
var acc = accountRepo.Get(x => x.Id == 42);
if (acc != null)
{
    acc.Balance = 100500;
    accountRepo.Update(acc);
}
 
_dataService.SaveChanges(); // Сохранение изменений во всех репозиториях РАЗОМ
0
0 / 0 / 0
Регистрация: 01.03.2018
Сообщений: 54
23.10.2018, 09:13  [ТС]
Usaga, не совсем понял как должен выглядеть метод get, в репозитории т.е. нужно несколько перегружены методов get?
И еще вопрос, а что если использовать в сервисе для получения акаунта, скажем по логину:
C#
1
2
3
4
 
IQueryable<T> Query(){ 
   return entities;
}
А после уже фильтровать использую оператор select, where, таким образом будет генерироваться sql запрос, который будет получать нужного пользователя, уже применяя ограничения. Насколько это уместно?
0
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,405
23.10.2018, 16:57
Лучший ответ Сообщение было отмечено makoooo как решение

Решение

Цитата Сообщение от makoooo Посмотреть сообщение
И еще вопрос, а что если использовать в сервисе для получения акаунта, скажем по логину:
Тогда вы прибьёте себя гвоздями к EF (конкретной версии, что является существенно проблемой) и к IQueryable<T>. Мы на работе через это уже прошли. Все сервисы в бизнес-логике использовали IQueryable. Это было удобно и просто. Теперь мучаемся.

Цитата Сообщение от makoooo Посмотреть сообщение
не совсем понял как должен выглядеть метод get
C#
1
2
3
4
5
6
7
8
9
public T Get<T>(params Expression<Func<T, bool>>[] predicates)
{
    var q = dataContext.Set<T>();
 
    foreach(var predicate in predicates)
         q = q.Where(predicate);
 
    return q.First();
}
Так же можно поступить и с Dependency properties.
1
0 / 0 / 0
Регистрация: 01.03.2018
Сообщений: 54
25.10.2018, 10:09  [ТС]
Добавить хотел вопрос небольшой, есть ли какие то определенные стандарты, для структурирования контроллеров? Сейчас они просто находятся в папке controllers, какая общая практика по организации их?
0
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,405
25.10.2018, 10:16
makoooo, если контроллеров совсем дофига, то их можно раскладывать по папочкам в папке Controllers. Или делить приложение на Areas.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.10.2018, 10:16
Помогаю со студенческими работами здесь

Unit test сервиса, принимающего как аргумент репозиторий, а репозиторий организован через mysql.connector Python 3
Всем привет. Теории много, примеров много, а как возьмешься, толку мало. Особенно из разряда, создается mock объект, в него что-то...

Почему паттерн абстрактная фабрика - паттерн уровня объектов, если в нём могут быть статические отношения?
Взято из Шевчук А., Охрименко Д., Касьянов А. Design Patterns via C#. Приемы объектно-ориентированного проектирования (2015): Почему...

ASUS F3Jp: замена Core 2 Duo T5500 на Core 2 Quad Q9000
Добрый день! У меня есть возможность заменить в моём ноутбуке (ASUS F3Jp) процессор Intel Core 2 Duo T5500 (TDP: 34 W) на Intel Core 2...

Intel Core i3-380M или AMD Athlon 2 Dual-Core P360
Всем доброго времени суток. Друзья у меня вышла такая ситуация: Купил ноут(MSI FX603) (проц Intel Core i3-380M) изначально он был...

Замена ЦП поменять проц Dual Core на Core 2 Duo. Целесообразно ли это?
Всем привет. Возник такой вопрос. Имеется довольно старый ПК. Также имеется желание слегка его обновить, о не тратиться на новую сборку....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru