Конфликт множественности при настройке Entity Framework - PullRequest
1 голос
/ 10 апреля 2019

У меня есть более сложный вопрос здесь

Но подумал, что я бы упростил это.

Вот мои фиктивные классы (структура, на которой они основаны, пришла из НДЦ, поэтому я не могу их контролировать):

public class RightHand
{
    [Key]
    public int RightHandId { get; set; }
    public string PropertyA { get; set; }

    [Required]
    public virtual Linker Linker { get; set; }
}

public class LeftHand
{
    [Key]
    public int LeftHandId { get; set; }
    public string PropertyB { get; set; }

    [Required]
    public virtual Linker Linker { get; set; }
}

public class Linker
{
    [Key]
    public int LinkerId { get; set; }
    [ForeignKey("RightHand")]
    public int RightHandId { get; set; }
    [ForeignKey("LeftHand")]
    public int LeftHandId { get; set; }
    public string PropertyC { get; set; }

    [Required]
    public virtual RightHand RightHand  { get; set; }
    [Required]
    public virtual LeftHand LeftHand  { get; set; }
}

Я пробовал очень много вещей, так что, надеюсь, эта упрощенная версия может помочь кому-нибудь помочь мне.

Над всем, я хочу искать:

  • LeftHand.PropertyB и посмотрите свойства для RightHand
  • Также я хочу выполнить поиск по RightHand.PropertyA и просмотреть свойства для левой руки

В общем, мне нет дела до Линкера, за исключением того, что связывает LeftHand и RightHand. LeftHand и RightHand один к одному.

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<RightHand>()
            .Property(x => x.RightHandId)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        modelBuilder.Entity<LeftHand>()
            .Property(x => x.LeftHandId)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        modelBuilder.Entity<Linker>()
            .Property(x => x.LinkerId)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        modelBuilder.Entity<Linker>()
            .HasRequired(nus => nus.LeftHand)
            ;

        modelBuilder.Entity<Linker>()
            .HasRequired(nuu => nuu.RightHand)
            ;
    }

Спасибо, я использую VS2017, EF 6.2, Code First, SQL Server

Я пробовал разные аннотации, но одна распространенная ошибка:

Linker_LeftHand_Source:: множественность недопустима в роли 'Linker_LeftHand_Source' в отношении 'Linker_LeftHand'. Поскольку свойства зависимой роли не являются ключевыми свойствами, верхняя граница кратности зависимой роли должна быть «*».

Linker_RightHand_Source:: множественность недопустима в роли 'Linker_RightHand_Source' в отношении 'Linker_RightHand'. Поскольку свойства зависимой роли не являются ключевыми свойствами, верхняя граница кратности зависимой роли должна быть «*».

Что отличается от других ответов о множественности, так это средняя таблица компоновщиков.

1 Ответ

1 голос
/ 10 апреля 2019

Как Entity Framework 6.x не поддерживает отношение one-to-one с явным свойством внешнего ключа, и если вы попытаетесь обойти его с помощью аннотации данных ForeignKey, вы получите ошибку множественности во время миграции.

Таким образом, единственное решение: Удалить RightHandId и LeftHandId свойства из Linker класса модели следующим образом:

public class Linker
{
    [Key]
    public int LinkerId { get; set; }
    public string PropertyC { get; set; }

    public RightHand RightHand { get; set; }
    public LeftHand LeftHand { get; set; }
}

Тогда ваши конфигурации модели должны быть следующими:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<LeftHand>().HasOptional(l => l.Linker)
            .WithOptionalPrincipal(lf => lf.LeftHand)
            .Map(lf => lf.MapKey("LeftHandId"));

        modelBuilder.Entity<RightHand>().HasOptional(l => l.Linker)
            .WithOptionalPrincipal(lf => lf.RightHand)
            .Map(lf => lf.MapKey("RightHandId"));
 }
...