表拆分
现在让我们假设你要执行与实体拆分相反的操作:不是将一个实体映射到两个表,而是希望将一个表映射到两个实体。这称为表拆分。假设你有一个包含五列的表: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"));
}
}