Отображение TPT в EF Code First 4.1 с разными первичными ключами - PullRequest
6 голосов
/ 13 июля 2011

Я пытаюсь отобразить иерархию наследования TPT в устаревшей базе данных (я не могу изменить имена столбцов).Все примеры имеют первичные ключи родительской и дочерней таблиц с одинаковыми именами.К сожалению, мой не ведет себя таким образом.

В качестве упрощенного примера:

Vehicle
----------------
VehicleId
Make
Model
----------------

Car
----------------
CarId        
SomeOtherField
----------------

CarId и VehicleId на самом деле являются одним и тем же идентификатором и являются значениями, которые следует использовать для связи таблиц,Есть ли поддержка для создания этого отношения TPT в Code First?

Ответы [ 3 ]

3 голосов
/ 13 июля 2011

Здесь - заявление об этой проблеме от команды EF:

К сожалению, на данном этапе это невозможно. Я понимаю, что это не отличный ответ, но одним из вариантов будет создание представления, которое переименовывает столбец PK / FK, а затем сопоставить с ним.

Это с февраля 2011 года. Так что это было связано с более ранней CTP-версией EF Code-First. Но я считаю, что этот сценарий до сих пор не поддерживается в EF 4.1.

Также похожий вопрос здесь с неудовлетворительным результатом в отношении EF 4.1 Code-First: Как я могу использовать модели наследования TPT, когда первичные ключи имеют разные имена?

1 голос
/ 24 августа 2011

Я получил это для работы, выполнив следующее:

  1. Удалите все свойства навигации между базовым и унаследованными объектами.
  2. Удалите внешний ключ из унаследованных объектов, а такжеУдалите сопоставление свойств для внешнего ключа в унаследованных объектах.
  3. Удалите сопоставление таблицы в унаследованных объектах.
  4. Добавьте параметр сгенерированной базы данных идентификации в первичный ключ унаследованных объектов (если вы используетеидентичность на PK).
  5. Добавьте карту для базового типа к производному типу и (важный бит) в карте явно сопоставьте каждое свойство, отсутствующее в базовом классе / таблице.На карте также сопоставьте производный тип с таблицей производного типа.

Это должно в значительной степени сделать это.Ссылка на пример решения в EF <-> RIA <-> Silverlight, который также показывает обходной путь для свойства с одинаковым именем в базовом и производных типах (решение по сути состоит просто в том, чтобы переименовать свойство либо в базовомтип или производные типы).

http://dotnetdavis.com/upload/content/source.zip

0 голосов
/ 23 июня 2014

Я нашел ответ для этой статьи здесь: http://entityframework.codeplex.com/workitem/2087. Для вашего случая вам нужно:

  1. В C # определить сущность Vehicle (VehicleId, Make, Model)
  2. В C # определите сущность Car (SomeOtherField), полученную из столбца Vehicle // CarId, который будет отображаться в VehicleId, см. Ниже.
  3. В 'защищенном переопределении void OnModelCreating (DbModelBuilder modelBuilder)' сделать это:

    modelBuilder.Entity () .ToTable ("Car") .Property (t => t.VehicleId) .HasColumnName ("CarId");

...