Как добавить ассоциацию 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 с этими объединенными таблицами и использовать одну.

Другие вопросы по тегам