|
EF 6 database views or navigation properties?
|
|||
---|---|---|---|
#18+
WPF + EF 6.1.3(Code first) + PostgreSql. Задача - клиент серверное приложение документооборота, ~100 сущностей. Каждая сущность наследует: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Для каждой таблицы создается 2 внешних ключа(CreateUserId, UpdateUserId). Правильный ли это подход? Некоторые сущности имеют более 5 навигационных свойств(внешних ключей), преимущественно связь 1 к 1, в расширении необходимо вывести сущность и все связанные свойства. Вероятно, сущности будут часто модернизироваться. На практике, что лучше: - создать класс расширение с перечислением всех необходимых свойств - использовать View из БД? Как организовать CRUD операции?: - редактировать ItemsSource(ObservableCollection<ChangeTrackingEntity>) - обновить ItemsSource из БД? Хочу минимизировать запросы к БД, но и данные у пользователя должны быть актуальные. В идеале ищу эталонный пример работы с EF. Благодарю за любую помощь ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2017, 20:08 |
|
EF 6 database views or navigation properties?
|
|||
---|---|---|---|
#18+
sa13m, Все эти поля: CreatedDate, UpdateDate, CreatedUserId, UpdatedUserId — по большему счёту бесполезная информация, только засоряющее табличное пространство, и не дающая ничего, что можно хоть как-то применить. Если пользователь создал запись, то следующим апдейтом от записи ничего кроме ID не останется. И что с этой информацией делать? По сути некий пользователь в определённое время создал вот этот ID. Весь ChangeTracking лучше всего вести отдельно, с полной информацией: кто, что, когда, откуда? Учитывая, что используется Postgres, подробную информацию о характере изменений можно складывать в JSON поле. CRUD операции лучше организовать через паттерн Репозиторий. ObservableCollection тебе определённо, совершенно точно, абсолютно не нужен, так как EF итак ведёт свой чендж трекер, не нужно городить огрод поверх него. А вообще, если хочешь достичь дзена, уменьшить до минимума количество бесполезной бестолковой работы, изучай CQRS/ES/DDD. Для документооборота это очень хорошо подходит. Да прибудет с тобой сила :) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2017, 22:24 |
|
EF 6 database views or navigation properties?
|
|||
---|---|---|---|
#18+
sa13m, Хотя, если речь идёт о WPF, и характер работы это обычный CRUD с минимальной логикой, можешь работать напрямую с EF/Entity, через какую-нибудь простенькую абстракцию. Но насчёт IChangeTrackingEntity, убери эти бестолковые поля, кочующие как гнусный паразит из проектов в проект, уже без особых понятий втыкают эти поля, даже не зная как это реально можно использовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2017, 22:27 |
|
EF 6 database views or navigation properties?
|
|||
---|---|---|---|
#18+
hVostt, Я не работаю с открытым контекстом, для каждой CRUD операции создаю новый. Использую патерн Repository и UnitOfWork. По CRUD операциям хотел сказать, что если использовать сущность без select new или view (ObservableCollection<Customer> сustomers), то все просто после SaveChanges() -> customers.Add(newCustomer) без лишних запросов к БД, с select new или view не все так просто. Стоит задача отслеживать любые изменения в любой сущности для этого и ChangeTrackingEntity + таблица History Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Можно отказаться от ChangeTrackingEntity в сущностях и писать все это в History, тогда для получению инфы по изменениям нужно join с History, я думаю это будет накладно. Или Вы предлагаете создать для каждой сущности public string ChangeTracking { get; set; }? В планах еще репликация офис<->подразделения на основе логического декодирования с фильтрацией(готового решения пока не нашел). ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2017, 23:57 |
|
EF 6 database views or navigation properties?
|
|||
---|---|---|---|
#18+
sa13mСтоит задача отслеживать любые изменения в любой сущности для этого и ChangeTrackingEntity + таблица History Я понимаю, что стоит такая задача. Я не понимаю, чем тебе помогут поля (CreatedDate, UpdateDate, CreatedUserId, UpdatedUserId), они ни о чём не говорят по сути. sa13mМожно отказаться от ChangeTrackingEntity в сущностях и писать все это в History, тогда для получению инфы по изменениям нужно join с History, я думаю это будет накладно. Тебе или шашечки, или ехать :) Ничего не даётся бесплатно. sa13mне работаю с открытым контекстом, для каждой CRUD операции создаю новый. Использую патерн Repository и UnitOfWork. По CRUD операциям хотел сказать, что если использовать сущность без select new или view (ObservableCollection<Customer> сustomers), то все просто после SaveChanges() -> customers.Add(newCustomer) без лишних запросов к БД, с select new или view не все так просто. Ты хочешь избавиться от предварительного селекта для обновления? Но в этом есть смысл! Иначе как ты определишь что изменилось и что ты положишь в свой History? Подумай. Если тебе всё равно на хистори, то кроме всего прочего, EF занимается валидацией данных, если там какая-то иерархия, обрабатывает её. В любом случае правильно сначала забрать данные, потом обновить. Ещё к EF можно прикрутить кеш второго уровня, чтобы он не лазил за данными лишний раз. В общем решений масса. И все они чуть-чуть ущербные... sa13mВ планах еще репликация офис<->подразделения на основе логического декодирования с фильтрацией(готового решения пока не нашел). Вот тут ничего не понял. Какое ещё декодирование? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2017, 02:06 |
|
|
start [/forum/topic.php?fid=17&msg=39441271&tid=1349302]: |
0ms |
get settings: |
12ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
186ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
others: | 247ms |
total: | 530ms |
0 / 0 |