Entity Framework. Помогите с архитектурой

332
17 февраля 2017, 00:32

Задача. Есть база фильмов (фильм имеет различные поля, в данном контексте не имеет значение какие). В частности, фильм имеет коллекцию жанров. То есть еще существует таблица с жанрами и таблица для связи фильма и жанра "многие ко многим".

Делаю приложение WPF. Базой рулит отдельная библиотека классов. Чтобы оградить проект UI от EF, я решил сделать отдельный класс-адаптер (вопрос первый, нужен ли он или это плохая практика?). Адаптер инстансный. В адаптере создается контекст данных. Получается, что в рамках приложения я имею один экземпляр адаптера (а значит и один экземпляр контекста данных). Вопрос второй, это нормально? Ведь если каждый раз создавать новый контекст, приложение будет очень долго думать. При таком подходе у меня возникает еще проблема с сохранением данных. Ну например я открыл 2 формы, одна для редактирования информации о фильме, другая для редактирования набора жанров. И если я в форме редактирования жанров нажму "Сохранить" (то есть отправлю команду _context.SaveChanges()), то в базу занесутся и изменения, которые я внес, редактируя фильм (они ведь сделаны в одном контексте). Вопрос третий, как правильно работать с данными, чтобы такого не происходило? И вообще я не могу придумать, как прикрутить это все по человечески на MVVM. Пока что говнокодингом занимаюсь. :( В общем то это был четвертый вопрос. Как прикрутить это все на MVVM? Ко всему прочему мне нужен постраничный вывод. Пока приходит в голову только способ context.EntitySet.Skip(a).Take(b). И вот тут тоже вопрос. Правильно ли это? Не будет ли такой подход вызывать запрос всех предыдущих до скипа значений, прежде чем вернуть мне нужный набор?

Answer 1

Чтобы оградить проект UI от EF, я решил сделать отдельный класс-адаптер Просто можно использовать класс для контекста данных.

Если каждый раз создавать новый контекст, то почти ничего не изменится. Сейчас мощности вычислительной техники хватает, что бы создавать контекст постоянно. Можно создавать глобальную переменую для контекста и использовать её.

При таком подходе у меня возникает еще проблема с сохранением данных. Ну например я открыл 2 формы, одна для редактирования информации о фильме, другая для редактирования набора жанров. И если я в форме редактирования жанров нажму "Сохранить" (то есть отправлю команду _context.SaveChanges()), то в базу занесутся и изменения, которые я внес, редактируя фильм (они ведь сделаны в одном контексте).

Проблема с сохранениями не должна быть. Имеется 2 открытых формы и разные события для сохранения информации с форм. Нужно что бы context.Таблица.Add(ДАННЫЕ); и context.SaveChanges(); были в событие нажатия кнопки "Сохранить".

context.EntitySet.Skip(a).Take(b) - при таком запросе будет создан запрос к базе данных и он вернет только нужную выборку.

READ ALSO
Получить данные из папки

Получить данные из папки

Есть папка которая содержит ещё папки и файлы! Как получить данные из всех файлов находящихся в главной папке?

224
Цикл foreach в переменной

Цикл foreach в переменной

Как можно записать следующий код по-другому?

365
Laravel TokenMismatchException in VerifyCsrfToken.php line 68

Laravel TokenMismatchException in VerifyCsrfToken.php line 68

Есть такое дело - при отправке POST данных на сервр после истечения сессии - возникает данное исключениеНу или если на другой странице сделать...

718
Integrated Windows Authentication для PHP под IIS

Integrated Windows Authentication для PHP под IIS

Есть интранет-ресурс, написанный на PHPРаботает под управлением IIS6 (FastCGI)

465