實體分裂
所以假設你有一個像這樣的實體類:
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 列。