Действительно, проблема only с представлениями состоит в том, что они не всегда содержат уникальные первичные ключи-кандидаты.
Представление может содержать строки типа
ID1 ID2 SomeColumn
==================
1 4 A
1 5 A
1 5 B
, гдеоба столбца ID
происходят из столбцов таблицы первичного ключа.
При импорте в EDMX EF выведет первичный ключ и может сделать вывод, что { ID1, ID2 }
является хорошим кандидатом.Как видите, это не так.В этом случае он также должен включать SomeColumn
, но в других случаях может даже не быть уникальной комбинации полей представлений!
В Entity Framework 6 и более ранних версиях EF материализовал идентичные сущности, такие как
1 4 A
1 5 A
1 5 A (!)
Как видите, третья строка дублируется.
Это вызвало большую путаницу среди разработчиков и множество вопросов о переполнении стека.Просто, когда представление содержит правильный уникальный ключ-кандидат, который отображается как первичный ключ в модели EF, вполне нормально использовать представления для только для чтения данных в запросах EF.
Эта запутанная проблема больше не будет устранена в EF6, но ядро Entity Framework (начиная с версии 2.1) добавило поддержку чтения неидентифицируемых данных представления.Представление может быть прочитано в любом типе, и чтение представления просто возвратит строки представления без дублирования, вызванного неуникальными ключами: там являются без ключей.
Тип может быть добавлен кмодель по:
modelBuilder.Query<MyViewDto>().ToView("MyView");
... и используется в запросе LINQ следующим образом:
db.Query<MyViewDto>().Where(x => x.ID1 == 1)
Это будет преобразовано в запрос SQL с предложением WHERE
.