Как ссылаться на внешний ключ без HasForeignKey () - PullRequest
1 голос
/ 10 мая 2011

Использование EF 4.0 с обновлением 4.1 для POCO / code-first.

ОК, поэтому у меня есть модель домена, в которой тип Car имеет в коллекции несколько объектов типа Part. Итак, отношение один: много.

HasMany(v => v.Parts)
  .WithRequired()
  .HasForeignKey(v => v.CarId)
  .WillCascadeOnDelete();

Проблема в том, что мне нужно добавить свойство CarId к моему типу Part. Это утечка деталей ORM в мою модель предметной области - что плохо. Маркировка всего виртуального достаточно раздражает.

Глядя на XML-комментарий к документу для метода HasForeignKey(), можно сказать следующее:

Конфигурирует отношения для использования свойства внешнего ключа, которые выставлены в объектной модели. Если свойства внешнего ключа не подвергается в объектной модели, а затем использовать Метод карты.

Отлично и все. Но это вводит ловушку 22, потому что, если я произвожу рефакторинг своего типа Part, удаляя ненужное мне свойство CarId, и обновлю свой построитель моделей EF, чтобы не беспокоить сопоставление этого свойства. Тогда, как вы можете себе представить, это означает, что я не могу тогда позвонить HasKey() для определения составного ключа, ala:

HasKey(v => new { v.CarId, v.PartId });

HasKey(), по-видимому, не поддерживает определение ключей на основе лямбда-нели-Собственности.

Какое здесь решение?

Ответы [ 2 ]

1 голос
/ 10 мая 2011

Если вам абсолютно не нравится иметь свойства внешнего ключа в вашей модели, вы можете удалить соглашение об обнаружении свойств FK, чтобы EF не помечал свойства автоматически как свойства FK ...

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions
        .Remove<NavigationPropertyNameForeignKeyDiscoveryConvention>();
}

... и тогда просто не указывайте свойство FK в вашем отображении:

HasMany(v => v.Parts)
    .WithRequired()
    .WillCascadeOnDelete();

Вам все еще нужно CarId в вашей модели, потому что он является частью первичного ключа, но таким образом он больше не действует как свойство внешнего ключа.

Просто идея, я не уверен, работает ли она.

1 голос
/ 10 мая 2011

Ну, а как насчет добавления нового поля ключа в таблицу CarParts, например, CarPartId, чтобы вам не понадобился составной ключ. (Поддержка составных ключей не так уж и хороша при работе с ORM.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...