Как сделать код «много ко многим» первым, когда внешний ключ не содержит полный первичный ключ - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь смоделировать отношения многие ко многим. Это мой контекст:

modelBuilder.Entity<Description>(entity =>
{
    entity.HasKey(e => new { e.DescriptionID, e.Language });
});
modelBuilder.Entity<Company>(entity =>
{
    entity.HasKey(e => e.CompanyID);
});

modelBuilder.Entity<CompanyDescription>()
    .HasKey(cd => new { cd.CompanyID, cd.DescriptionID });
modelBuilder.Entity<CompanyDescription>()
    .HasOne(cd => cd.Company)
    .WithMany(c => c.CompanyDescriptions)
    .HasForeignKey(bc => bc.CompanyID);
modelBuilder.Entity<CompanyDescription>()
    .HasOne(cd => cd.Description)
    .WithMany(c => c.CompanyDescriptions)
    .HasForeignKey(bc => bc.DescriptionID);

CompanyDescription - кросс-таблица. И компания, и описание содержат

public ICollection<CompanyDescription> CompanyDescriptions { get; set; }

Компания может иметь много описаний, а описание может иметь много компаний. В настоящее время база данных настроена так, что описание не содержит внешнего ключа, а компания содержит только «DescriptionID», но не язык. Таким образом, этот «внешний ключ» не соответствует первичному ключу описания. Из-за этого я получаю:

Отношение «CompanyDescription.Description» к «Description.CompanyDescription» со свойствами внешнего ключа {'DescriptionID': int} не может указывать первичный ключ {'DescriptionID': int, 'Language': string}, потому что это не совместимы. Настройте основной ключ или набор совместимых внешних ключевые свойства для этого отношения.

Как лучше всего решить эту проблему?

Редактировать, модель классов:

public partial class Company
{
    public int CompanyID { get; set; }
    public int DescriptionID { get; set; }
    public ICollection<CompanyDescription> CompanyDescriptions { get; set; }
}
public partial class Description
{
    public int DescriptionID { get; set; }
    public ICollection<CompanyDescription> CompanyDescriptions { get; set; }
}

Таблица кросс:

public class CompanyDescription
{
    public int CompanyID { get; set; }
    public RN_Company Company { get; set; }
    public int DescriptionID { get; set; }
    public string Language { get; set; }
    public Description Description { get; set; }
}

1 Ответ

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

Так как many-to-many отношение между Company и Description, Company не должно содержать ни DescriptionID, ни оба DescriptionID и Language.Как вы сказали, компания содержит только «DescriptionID», но не язык .Затем удалите DescriptionID из класса модели Company.

Тогда ваша сущность CompanyDescription должна выглядеть следующим образом:

public class CompanyDescription
{
   public int CompanyID {get; set;}

   public int DescriptionID {get; set;}
   public string Language  {get; set;}

   public Company Company {get; set;}
   public Description Description {get; set;}
}

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

modelBuilder.Entity<CompanyDescription>()
    .HasKey(cd => new { cd.CompanyID, cd.DescriptionID, cd.Language }); // <-- Here it is

modelBuilder.Entity<CompanyDescription>()
    .HasOne(cd => cd.Company)
    .WithMany(c => c.CompanyDescriptions)
    .HasForeignKey(bc => bc.CompanyID);

modelBuilder.Entity<CompanyDescription>()
    .HasOne(cd => cd.Description)
    .WithMany(c => c.CompanyDescriptions)
    .HasForeignKey(bc => new { bc.DescriptionID, bc.Language}); // <-- Here it is
...