Как я могу настроить два свойства навигации одного типа в Entity Framework - PullRequest
12 голосов
/ 13 декабря 2010

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

Пример кода:

В этой модели в таблицу AdapterFrameCapability для PressType добавлено одно свойство с именем PressTypeID.

public class AdapterFrameCapability
{
    [Key]
    public int AdapterFrameCapabilityID { get; set; }

    [Required]
    public int PressTypeID { get; set; }

    public virtual PressType PressType { get; set; }
}

Это настройка, которую я хочу смоделировать, но в результате в таблице создаются 4 столбца, по одному для FromPressTypeID, FromPressTypeFromPressTypeID, ToPressTypeID и ToPressTypePressTypeID. В идеале я бы просто хотел столбец для FromPressTypeID и ToPressTypeID. Что я тут не так делаю?

public class AdapterFrameCapability
{
    [Key]
    public int AdapterFrameCapabilityID { get; set; }

    [Required]
    public int FromPressTypeID { get; set; }

    [Display(Name = "From Press Type")]
    public virtual PressType FromPressType { get; set; }

    [Required]
    public int ToPressTypeID { get; set; }

    [Display(Name = "To Press Type")]
    public virtual PressType ToPressType { get; set; }
}

Ответы [ 2 ]

14 голосов
/ 14 декабря 2010

Это один из тех сценариев, в которых вам нужно раскрыть свободный API , чтобы получить желаемую схему:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<AdapterFrameCapability>()
                .HasRequired(afc => afc.FromPressType)
                .WithMany()
                .HasForeignKey(afc => afc.FromPressTypeID)
                .WillCascadeOnDelete(true);

    modelBuilder.Entity<AdapterFrameCapability>()
                .HasRequired(afc => afc.ToPressType)
                .WithMany()
                .HasForeignKey(afc => afc.ToPressTypeID)
                .WillCascadeOnDelete(false);
}

Отключение каскадного удаления в одной из ассоциаций является преднамеренным, поскольку в противном случае SQL Server выдаст следующую ошибку:

Введение ограничения FOREIGN KEY 'AdapterFrameCapability_ToPressType' в таблицу 'AdapterFrameCapabilities' может вызвать циклы или несколько каскадных путей.Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION, либо измените другие ограничения FOREIGN KEY.Не удалось создать ограничение.

Так что нам нужно отключить его на одной из ассоциаций, как я делал в коде.

0 голосов
/ 17 декабря 2010

Я думал, вы предполагаете использовать атрибут аннотации данных

[ForeignKey("FromPressTypeId")]

и т.д.

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