Entity Framework是一种ORM(Object-Relational Mapping)技术,可以将对象映射到数据库中的关系表。在Entity Framework中,支持三种继承映射策略:TPH(Table Per Hierarchy)、TPT(Table Per Type)和TPC(Table Per Concrete class)。
TPH(Table Per Hierarchy)
TPH是一种将多个实体类型映射到单个表的继承映射策略。使用该策略,每个继承类型都会有一个唯一的类型标识符(Discriminator)。该标识符将用于区分类型并将它们存储在单个表中。
例如,我们有一个表格名为Animal
,一个抽象类AnimalBase
,有两个类Dog
和Cat
,其中Dog
和Cat
都是从AnimalBase
派生而来的。现在我们要将Dog
和Cat
映射到Animal
表中。我们可以使用以下代码:
public abstract class AnimalBase
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
public class Dog : AnimalBase
{
public string Breed { get; set; }
}
public class Cat : AnimalBase
{
public int Lives { get; set; }
}
public class AnimalContext : DbContext
{
public DbSet<AnimalBase> Animals { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<AnimalBase>()
.Map<Dog>(m => m.Requires("Discriminator").HasValue("Dog"))
.Map<Cat>(m => m.Requires("Discriminator").HasValue("Cat"));
}
}
在上面的代码中,OnModelCreating
方法用来配置DbContext
模型。我们使用Map
方法将Dog
和Cat
映射到AnimalBase
表中,并且都设置了不同的Discriminator
值。当我们从数据库中检索数据时,Entity Framework将根据Discriminator
值实例化相应的对象。
TPT(Table Per Type)
TPT是一种将每个继承类型映射到自己的表的继承映射策略。使用该策略,每个类型都会有自己的表格,其中包含其自身的属性。父类的属性将在每个类型的表中存在。
例如,我们使用同样的布局,但是我们想要将每个实体映射到自己的表中。我们可以使用以下代码:
public abstract class AnimalBase
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
public class Dog : AnimalBase
{
public string Breed { get; set; }
}
public class Cat : AnimalBase
{
public int Lives { get; set; }
}
public class AnimalContext : DbContext
{
public DbSet<AnimalBase> AnimalBases { get; set; }
public DbSet<Dog> Dogs { get; set; }
public DbSet<Cat> Cats { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Dog>().ToTable("Dogs");
modelBuilder.Entity<Cat>().ToTable("Cats");
}
}
在上面的代码中,我们分别创建了Dogs
和Cats
表,每个表格都包含继承类型自己的属性,以及从父类继承的公共属性。
TPC(Table Per Concrete class)
TPC是一种将每个非抽象继承类型映射到自己的表的继承映射策略。使用该策略,每个类型都将映射到自己的表中,其中包含它自己的属性以及从父类继承的属性。
例如,我们使用同样的布局,但是我们只想将实例化的类型映射到单独的表中。我们可以使用以下代码:
public abstract class AnimalBase
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
public class Dog : AnimalBase
{
public string Breed { get; set; }
}
public class Cat : AnimalBase
{
public int Lives { get; set; }
}
public class AnimalContext : DbContext
{
public DbSet<Dog> Dogs { get; set; }
public DbSet<Cat> Cats { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Dog>()
.Map(m => m.ToTable("Dogs"))
.HasKey(d => d.Id);
modelBuilder.Entity<Cat>()
.Map(m => m.ToTable("Cats"))
.HasKey(c => c.Id);
}
}
在上面的代码中,我们使用.Map
方法将Dog
和Cat
映射到各自的表中。由于每个表都有自己的Id
属性,我们还必须使用.HasKey
方法定义主键.
至此,我们完整讲解了Entity Framework映射TPH、TPT、TPC与继承类的攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Entity Framework映射TPH、TPT、TPC与继承类 - Python技术站