实体分裂

所以假设你有一个像这样的实体类:

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 列。