實體分裂

所以假設你有一個像這樣的實體類:

public class Person  
{
   public int PersonId { get; set; }
   public string Name { get; set; }
   public string ZipCode { get; set; }
   public string City { get; set; }
   public string AddressLine { get; set; }
}

然後,假設你要將此 Person 實體對映到兩個表 - 一個包含 PersonId 和 Name,另一個包含地址詳細資訊。當然,你也需要 PersonId,以便識別地址所屬的人。所以基本上你想要的是將實體分成兩個(甚至更多)部分。因此,名稱,實體分裂。你可以通過將每個屬性對映到不同的表來執行此操作:

public class MyDemoContext : DbContext  
{       
  public DbSet<Person> Products { get; set; }

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
      modelBuilder.Entity<Person>().Map(m =>
      {
         m.Properties(t => new { t.PersonId, t.Name });
         m.ToTable("People");
      }).Map(m => 
      {   
        m.Properties(t => new { t.PersonId, t.AddressLine, t.City, t.ZipCode });
        m.ToTable("PersonDetails");
      });
  }
}

這將建立兩個表:People 和 PersonDetails。Person 有兩個欄位,PersonId 和 Name,PersonDetails 有四列,PersonId,AddressLine,City 和 ZipCode。在 People 中,PersonId 是主鍵。在 PersonDetails 中,主鍵也是 PersonId,但它也是在 Person 表中引用 PersonId 的外來鍵。

如果查詢 People DbSet,EF 將在 PersonIds 上進行連線以從兩個表中獲取資料以填充實體。

你還可以更改列的名稱:

protected override void OnModelCreating(DbModelBuilder modelBuilder)  
{
  modelBuilder.Entity<Person>().Map(m =>
  {
    m.Properties(t => new { t.PersonId });
    m.Property(t => t.Name).HasColumnName("PersonName");
    m.ToTable("People");
  }).Map(m =>
  {
    m.Property(t => t.PersonId).HasColumnName("ProprietorId");
    m.Properties(t => new { t.AddressLine, t.City, t.ZipCode });
    m.ToTable("PersonDetails");
  });
}

這將建立相同的表結構,但在 People 表中將有一個 PersonName 列而不是 Name 列,而在 PersonDetails 表中將有一個 ProprietorId 而不是 PersonId 列。