Как добавить ассоциацию EF6 к ключу-кандидату / уникальному ключу, который не является первичным ключом?
Используя схему Во-первых, у меня есть структура базы данных, так что
ExternalDataItems
---
edataitem_id PK -- surrogate auto-increment - NOT for FK relation here
datahash UX -- Candidate Key / Unique Index (binary(20))
ExternalMaps
---
emap_id PK
ext_datahash FK on ExternalDataItems.datahash - NOT referencing the surrogate PK
и после генерации SSDL / CSDL1 имеет это
<Association Name="FK_ExtMaps_ExtDataItems">
<End Multiplicity="1" Role="ExternalDataItems" Type="Store.ExternalDataItems" />
<End Multiplicity="*" Role="ExternalMaps" Type="Store.ExternalMaps" />
<ReferentialConstraint> <!-- error on this element -->
<Principal Role="ExternalDataItems">
<PropertyRef Name="datahash" />
</Principal>
<Dependent Role="ExternalMaps">
<PropertyRef Name="ext_datahash" />
</Dependent>
</ReferentialConstraint>
</Association>
который генерирует ошибку на <ReferentialConstraint>
элемент
Выполнение преобразования: свойства, на которые ссылается основная роль ExternalDataItems, должны быть точно идентичны ключу EntityType ExternalDataItem, на который ссылается главная роль в ограничении отношений для Relationship FK_ExtMaps_ExtDataItems. Убедитесь, что все ключевые свойства указаны в главной роли.
"Основная роль" (?) Для SSDL ExternalDataItems выглядит следующим образом для PK, и UX, по-видимому, отсутствует2, за исключением простого скалярного свойства:
<EntityType Name="ExternalDataItems">
<Key>
<PropertyRef Name="edataitem_id" />
</Key>
..
<Property Name="datahash" Type="binary" MaxLength="20" Nullable="false" />
</EntityType>
Как я могу добавить это отношение - используя FK к ключу-кандидату не PK? (После того, как это "сработает", я также хочу иметь свойство навигации в CSDL.)
Кроме того, линия связи не отображается в области проектирования - что, я подозреваю, является просто следствием этой ошибки. Я использую Entity Framework версии 6.1.1 (последняя опубликована в nuget) и Visual Studio 2013 Ultimate Update 4.
1 Стандартное обновление EDMX "Обновление из базы данных", по-видимому, не учитывает эти отношения FK (что может быть связано с этой ошибкой), и приведенные выше результаты получены после использования инструмента Huagati DBML/EDMX. Если бы я попытался "Добавить ассоциацию" до этого, дизайнер неправильно попытался бы использовать первичный ключ - который не поддерживается ни одним отношением FK - и не предоставлял варианты выбора альтернативных свойств.
2 Попытка добавить <UniqueConstraint>
элемент, как описано в "Уникальных ограничениях в Entity Framework", приводит к ошибке дружественной проверки XML:
Элемент 'ElementType' .. имеет недопустимый дочерний элемент 'UniqueConstraint'.
1 ответ
Похоже, "отсутствует важная функция"
.. Entity Framework в настоящее время поддерживает только основание ссылочных ограничений на первичных ключах и не имеет понятия уникального ограничения.
Вы можете удалить внешний ключ в схеме БД и использовать LINQ для объединения таблиц:
from item in ExternalDataItems
join map in ExternalMaps on item.datahash = map.ext_datahash
select new { item.edataitem_id, map.emap_id };
Также вы можете создать VIEW с этими объединенными таблицами и использовать одну.