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

Как настроить два свойства навигации одного и того же типа в Entity Framework

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

Пример кода:

С помощью этой модели я получаю одно свойство, добавленное в таблицу 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; }
}
4b9b3361

Ответ 1

Это один из тех сценариев, для которого вам нужно опустить свободный 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. Не удалось создать ограничение.

Итак, нам нужно отключить его на одной из ассоциаций, подобных тому, как я это сделал в коде.

Ответ 2

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

[ForeignKey("FromPressTypeId")]

и др.