Ядро EF и создание таблицы "многие ко многим". Создает дополнительное поле. Зачем?

Почему существует поле UserProgramRefProgramCharacteristics.RefProgramCharacteristicsId??? Должно быть только 2 поля, а не 3. Верно? Ниже приведены 3 класса и OnModelCreating, необходимые для создания таблицы "многие ко многим".

  public class RefProgramCharacteristic
{
    public int Id { get; set; }

    public string ProgramCharacteristic { get; set; }

     public List<UserProgramRefProgramCharacteristic> UserProgramRefProgramCharacteristics { get; set; }

    // public ICollection<UserProgram> userPrograms { get; } = new List<UserProgram>();

   // public virtual ICollection<UserProgram> UserPrograms { get; set; }
}


  public class UserProgram
{
    public int Id { get; set; }

    //UserProgramSaved
    public bool MyList { get; set; }
    public float MyPriorityRating { get; set; }
    public int Similarity { get; set; }
    public bool Compare { get; set; }

    //UserProgramSimilarity
    public int OverallSimilarityScore { get; set; }
    public int DeltaProfileElement1_WorkExp { get; set; }
    public int DeltaProfileElement2_VolExp { get; set; }
    public int DeltaProfileElement3_ResExp { get; set; }
    public int DeltaProfileElement4_Pubs { get; set; }
    public int DeltaProfileElement5_Step1 { get; set; }
    public int DeltaProfileElement6_Step2ck { get; set; }
    public int DeltaProfileElement7_Aoa { get; set; }
    public int DeltaProfileElement8_Nspecialties { get; set; }
    public int DeltaProfileElement9_PercentApps { get; set; }

    //UserComparisonSaved
    //  public RefProgramCharacteristic RefProgramCharacteristic { get; set; }
    public string RefProgramCharacteristicList { get; set; }


    public string ApplicationUserId { get; set; }
    public ApplicationUser ApplicationUser { get; set; }


    public int MedicalProgramId { get; set; }
    public RefProgramDetailData MedicalProgram { get; set; }


     public List<UserProgramRefProgramCharacteristic> UserProgramRefProgramCharacteristics { get; set; }

   // public ICollection<RefProgramCharacteristic> RefProgramCharacteristics { get; } = new List<RefProgramCharacteristic>();

   // public virtual ICollection<RefProgramCharacteristic> RefProgramCharacteristics { get; set; }


}


   public class UserProgramRefProgramCharacteristic
{
  //  public int Id { get; set; }

    public int UserProgramId { get; set; }
    public UserProgram UserProgram { get; set; }


    public int RefProgramCharacteristicsId { get; set; }
    public RefProgramCharacteristic RefProgramCharacteristic { get; set; }
}


  protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<UserProgramRefProgramCharacteristic>()
            .HasKey(t => new { t.UserProgramId, t.RefProgramCharacteristicsId });

        base.OnModelCreating(builder);
    }

Sql Diagram

1 ответ

Решение

Почему существует поле UserProgramRefProgramCharacteristics.RefProgramCharacteristicsId?

Потому что вы говорите EF Core, чтобы создать такое поле здесь:

public int RefProgramCharacteristicsId { get; set; }
//                                 ^

В то время как свойство навигации называется RefProgramCharacteristic (нет s). И по основным соглашениям EF:

Если зависимый объект содержит свойство с именем < имя свойства первичного ключа>, <имя свойства навигации> <имя свойства первичного ключа> или <имя основного субъекта> <имя свойства первичного ключа>, то он будет настроен как внешний ключ.

RefProgramCharacteristicsId не соответствует ни одному из этих правил, поэтому EF Core создает теневое свойство FK с именем по умолчанию RefProgramCharacteristicId,

Либо переименуйте свойство в RefProgramCharacteristicId (лучше), или отобразите это явно, используя ForeignKey аннотация данных:

[ForeignKey(nameof(RefProgramCharacteristicsId))]
public RefProgramCharacteristic RefProgramCharacteristic { get; set; }

или же

[ForeignKey(nameof(RefProgramCharacteristic))]
public int RefProgramCharacteristicsId { get; set; }

или используя HasForeignKey свободный API:

builder.Entity<UserProgramRefProgramCharacteristic>()
    .HasOne(e => e.RefProgramCharacteristic)
    .WithMany(e => e.UserProgramRefProgramCharacteristics)
    .HasForeignKey(e => e.RefProgramCharacteristicsId);
Другие вопросы по тегам