Entity Framework是一种ORM(Object Relational Mapping)框架,通过实体映射来将数据库中的表映射到代码中的类。当数据库中的表存在继承关系时,Entity Framework提供了三种继承映射策略:TPH、TPT、TPC。
TPH
TPH(Table Per Hierarchy)策略将整个继承关系映射到同一张表中,该表有一个Discriminator列用于区分不同的子类。示例代码如下:
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Manager : Employee
{
public string Department { get; set; }
}
public class Developer : Employee
{
public string ProgrammingLanguage { get; set; }
}
public class MyDbContext : DbContext
{
public DbSet<Employee> Employees { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Employee>()
.Map<Manager>(m =>
{
m.Requires("EmployeeType").HasValue("Manager");
m.Properties(p => new { p.Id, p.Name, p.Department });
})
.Map<Developer>(d =>
{
d.Requires("EmployeeType").HasValue("Developer");
d.Properties(p => new { p.Id, p.Name, p.ProgrammingLanguage });
})
.ToTable("Employees");
}
}
上面的示例中,Employee作为基类,Manager和Developer作为其子类,整个继承关系映射到同一张表Employees中。Employee类没有任何映射配置,Manager和Developer分别通过Map方法进行映射配置,且都要指定Discriminator列的值。
TPT
TPT(Table Per Type)策略将每个子类映射到单独的表中,基类中的属性也会在每个子类对应的表中生成。示例代码如下:
public class Animal
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Cat : Animal
{
public string EyeColor { get; set; }
}
public class Dog : Animal
{
public string FurColor { get; set; }
}
public class MyDbContext : DbContext
{
public DbSet<Animal> Animals { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Cat>()
.ToTable("Cats");
modelBuilder.Entity<Dog>()
.ToTable("Dogs");
}
}
上面的示例中,Animal作为基类,Cat和Dog作为其子类,每个子类都映射到单独的表中。基类中的属性也会在每个子类对应的表中生成,所以Animal表不需要映射。
TPC
TPC(Table Per Concrete Type)策略将每个子类映射到单独的表中,但不包括基类中的属性。示例代码如下:
public abstract class Shape
{
public int Id { get; set; }
}
public class Rectangle : Shape
{
public int Width { get; set; }
public int Height { get; set; }
}
public class Circle : Shape
{
public int Radius { get; set; }
}
public class MyDbContext : DbContext
{
public DbSet<Rectangle> Rectangles { get; set; }
public DbSet<Circle> Circles { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Rectangle>()
.ToTable("Rectangles");
modelBuilder.Entity<Circle>()
.ToTable("Circles");
}
}
上面的示例中,Shape作为基类,Rectangle和Circle作为其子类,每个子类都映射到单独的表中。但基类中的属性不会在子类对应的表中生成,所以需要在每个子类中重新定义Id属性。
通过上述示例,相信你已经了解了Entity Framework中继承映射的三种策略:TPH、TPT、TPC。在实际开发中可以根据具体需求选择不同的策略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Entity Framework映射TPH、TPT、TPC与继承类 - Python技术站