多對多自定義連線實體

我不得不承認,我真的不喜歡讓 EF 推斷連線表沒有加入實體。你無法跟蹤人車關聯的額外資訊(假設它的有效日期),因為你無法修改該表。

此外,連線表中的 CarId 是主鍵的一部分,因此如果家庭購買新車,則必須先刪除舊關聯並新增新關聯。EF 隱藏了這一點,但這意味著你必須執行這兩個操作而不是簡單的更新(更不用說頻繁的插入/刪除可能會導致索引碎片 - 好的方法是有一個簡單的解決方法)。

在這種情況下,你可以建立一個連線實體,該實體可以引用一個特定的汽車和一個特定的人。基本上,你將多對多關聯視為兩個一對多關聯的組合:

public class PersonToCar
{
   public int PersonToCarId { get; set; }
   public int CarId { get; set; }
   public virtual Car Car { get; set; }
   public int PersonId { get; set; }
   public virtual Person Person { get; set; }
   public DateTime ValidFrom { get; set; }
}

public class Person
{
  public int PersonId { get; set; }
  public string Name { get; set; }
  public virtual ICollection<PersonToCar> CarOwnerShips { get; set; }
}

public class Car
{
  public int CarId { get; set; }
  public string LicensePlate { get; set; }        
  public virtual ICollection<PersonToCar> Ownerships { get; set; }
}

public class MyDemoContext : DbContext
{
  public DbSet<Person> People { get; set; }
  public DbSet<Car> Cars { get; set; }
  public DbSet<PersonToCar> PersonToCars { get; set; }
}

這給了我更多的控制權,而且更加靈活。我現在可以向關聯新增自定義資料,並且每個關聯都有自己的主鍵,因此我可以更新汽車或其中的所有者引用。

請注意,這實際上只是兩個一對多關係的組合,因此你可以使用前面示例中討論的所有配置選項。