Подтвердить что ты не робот

Как добавить ассоциацию 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/CSDL 1 имеет этот

    <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, на который ссылается основная роль в ограничении связей для отношений FK_ExtMaps_ExtDataItems. Убедитесь, что все ключевые свойства указаны в главной роли.

"Основная роль" (?) для ExternalDataItems SSDL выглядит следующим образом: для ПК и UX не присутствует 2 кроме как простое скалярное свойство:

  <EntityType Name="ExternalDataItems">
      <Key>
        <PropertyRef Name="edataitem_id" />
      </Key>
      ..
      <Property Name="datahash" Type="binary" MaxLength="20" Nullable="false" />
  </EntityType>

Как я могу добавить это отношение - используя FK к ключу кандидата, отличному от ПК? (После этого "работает" я также хочу, чтобы в CSDL также было свойство Navigation.)

Кроме того, линия связи не появляется на поверхности дизайна, которая, как я подозреваю, является просто следствием этой ошибки. Я использую 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".

4b9b3361

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