表拆分

现在让我们假设你要执行与实体拆分相反的操作:不是将一个实体映射到两个表,而是希望将一个表映射到两个实体。这称为表拆分。假设你有一个包含五列的表:PersonId,Name,AddressLine,City,ZipCode,其中 PersonId 是主键。然后你想创建一个这样的 EF 模型:

public class Person  
{
  public int PersonId { get; set; }
  public string Name { get; set; }
  public Address Address { get; set; }
}

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

有一件事情就是跳出来:地址中没有 AddressId。这是因为两个实体映射到同一个表,因此它们也必须具有相同的主键。如果你进行表格拆分,这是你必须要处理的事情。因此,除了表拆分之外,还必须配置 Address 实体并指定主键。这是如何:

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

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
     modelBuilder.Entity<Address>().HasKey(t => t.PersonId);
     modelBuilder.Entity<Person>().HasRequired(t => t.Address)
                                  .WithRequiredPrincipal(t => t.Person);

     modelBuilder.Entity<Person>().Map(m => m.ToTable("People"));
     modelBuilder.Entity<Address>().Map(m => m.ToTable("People"));
  }
}