Если у меня есть таблицы SQL Server, подобные этим:
Location
----------
LocationId int PK
Field1 int
Field2 int
etc
Score
------------------------------------
LocationId int PK, FK
IsSingleLevel bit PK (discriminator)
Field1 int
Field2 int
etc
Технически это отображается как Location 1..0 .. * Score, но с PK LocationId / IsSingleLevel, это Location 1..0..2.
Когда я перетаскиваю это на EDMX, все настраиваю как положено (абстрактная сущность, удаляем дискриминатор из базовой сущности и т. Д.).
EF дает эту ошибку тривремена (один для базового объекта и один для двух производных объектов):
Ошибка 6 Ошибка 3025: проблема при отображении фрагментов, начиная со строки 2146: необходимо указать отображение для всех ключевых свойств (LocationScore.LocationId), LocationScore.IsSingleLevelScore) таблицы LocationScore.
Я последовал примеру здесь .
Ошибка возникает из-за того, что у меня есть дискриминатор как часть PK вбаза данных и дискриминаторы не отображаются в модели, поэтому я получаю сообщение об ошибке.
У меня не может быть LocationId
в качестве единственного поля в ПК, потому что тогда местоположение может иметь только 1 балл,мне нужно это иметьдва балла (один единственный уровень, один общий).
Конечным результатом является то, что я хочу иметь возможность сделать это:
Locations.Include("LocationOverallScore").Single();
Locations.Include("LocationSingleLevelScore").Single();
Где LocationOverallScore
и LocationSingleLevelScore
являются производными объектамииз базы LocationScore
(абстрактная сущность).
Разве ТПХ не является правильным дизайном здесь?Мой дизайн базы данных неправильный?Цель состоит в том, чтобы я не хотел иметь две физические таблицы для разных оценок - поскольку таблица огромна, и я не хочу повторять столбцы.
Есть два возможных обходных пути, о которых я могу подумать:
1 - Создайте представление (LocationScore), в котором UNION две таблицы (поэтому он будет возвращать 2 строки на LocationId), но я все еще не могуне думаю, что я могу "ТПХ" это.Я не хочу вручную выполнять JOIN, я хочу загружать.
2 - Добавить столбец IDENTITY в Score, и это может быть PK.
Можете ли вы, ребята, придумать другое решение?