实体分裂
所以假设你有一个像这样的实体类:
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 列。