Композитные общие ключи и сущность - PullRequest
1 голос
/ 27 января 2020

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

Представьте себе следующее:

public class Sale
{
        public long ID { get; set; } //Key
        public long RetailerID { get; set; } //Key
        public virtual Location Location { get; set; } //Foreign, Many-to-One
}
public class Location
{
        public long ID { get; set; } //Key
        public long RetailerID { get; set; } //Key
        public virtual IEnumerable<Sale> Sales { get; set; } //Relationship, One-to-Many
}

Оба используют свободный API для определения составных ключей OnModelCreating ,

modelBuilder.Entity<Sale>().HasKey(x => new { x.RetailerID, x.ID });
modelBuilder.Entity<Location>().HasKey(x => new { x.RetailerID, x.ID });

Однако я не уверен, как завершить это sh, чтобы установить правильные отношения, поскольку он устанавливает себя как наличие дублирующих столбцов для RetailerID, что не является необходимым. Как это должно быть сделано правильно (если вообще?)

1 Ответ

3 голосов
/ 27 января 2020

Это возможно несколькими способами, включая дополнительное свойство LocationID FK (явное или shadow ).

  • Со свойством shadow FK (без изменения модели объекта) :

Аннотации данных:

[Required]
[ForeignKey("RetailerID, LocationID")]
public virtual Location Location { get; set; } //Foreign, Many-to-One

Свободный API:

modelBuilder.Entity<Sale>()
    .HasOne(e => e.Location)
    .WithMany(e => e.Sales)
    .HasForeignKey("RetailerID", "LocationID")
    .IsRequired();
  • с явное свойство FK

модель:

public long LocationID { get; set; } // added
public virtual Location Location { get; set; } //Foreign, Many-to-One

аннотации данных:

[ForeignKey("RetailerID, LocationID")]
public virtual Location Location { get; set; } //Foreign, Many-to-One

Свободный API:

modelBuilder.Entity<Sale>()
    .HasOne(e => e.Location)
    .WithMany(e => e.Sales)
    .HasForeignKey(e => new { e.RetailerID, e.LocationID });

(примечание: используйте аннотации данных или свободный API - нет необходимости в обоих)

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