摘要:一是常用的策略,通过外键来表示继承,父类和子类分别位于不同的表中,子类表包含自身属性列和父类表的外键,并将父表的外键作为子类表的主键。与父类的多态关联将被表示为引用父类表的外键。
继承是面向对象开发时经常用到的,但是SQL Server 数据库不具备继承,那么怎么办能?我们可以利用如下三种方法:
TPH(Table per Hierachy):对SQL架构进行非规范化来表示多态,使用鉴别列对类型区分;
TPT(Table per Type):用外键表示继承关系
TPC(Table per Concete class):完全丢弃多态和继承
零、TPHTPH是将整个类层次映射到但表中,该表包含所有类中的所有属性,特定行表示的具体子类通过 discriminator 来标识区分。TPH是Code First 默认人的继承策略,没有表示C#的多态特性,优点是不需要联合查询,是最简单的策略。缺点是除主键和标识列 discriminator 外,其他的列都是可为空。父类中的某些属性对于子类来说并不是必需的,因此Code First 会将改属性创建为可空列。TPH策略因为有 discriminator 列的存在,维护性不强,因此违反了第三范式。
一、TPTTPT是常用的策略,通过外键来表示继承,父类和子类分别位于不同的表中,子类表包含自身属性列和父类表的外键,并将父表的外键作为子类表的主键。定义TPT继承策略需要在上下文中进行如下配置:
modelBuilder.Entity().ToTable("Person"); modelBuilder.Entity ().ToTable("Woman");
TPT的有点是将模型进行了扁平化,对父类的修改或对子类的添加都只是操作各自的表。与父类的多态关联将被表示为引用父类表的外键。缺点在于性能极差,如果要进行查询就要多表连接查询。
二、 TPCTPC是不被推荐的策略,因为他会为每个子类创建一个表,并且将父类中的所有属性映射进每个子类表中。创建TPC映射,需要在上下文中进行如下定义:
modelBuilder.Entity().Map(p=>{ p.MapInheritedProperties(); p.ToTable("Person"); }); modelBuilder.Entity ().Map(p=>{ p.MapInheritedProperties(); p.ToTable("Woman"); });
注:参与TPC继承层次结构的表不共享主键,因此插入到子类表中的数据会存在重复的主键。要解决这个问题需要为每个表指定不同的标识,也可以关闭主键属性的标识。
下面总结一下以上三种策略的使用场景
策略 | 场景 |
---|---|
TPC | 不需要多表关联查询或者很少查询父类数据,并且没有与父类关联的类 |
TPH | 需要多表关联查询,且子类的属性较少 |
TPT | 需要多表关联查询,且子类的属性很多 |
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/61402.html
摘要:一是常用的策略,通过外键来表示继承,父类和子类分别位于不同的表中,子类表包含自身属性列和父类表的外键,并将父表的外键作为子类表的主键。与父类的多态关联将被表示为引用父类表的外键。 继承是面向对象开发时经常用到的,但是SQL Server 数据库不具备继承,那么怎么办能?我们可以利用如下三种方法: TPH(Table per Hierachy):对SQL架构进行非规范化来表示多态,使用...
摘要:零什么是简称,是的实体框架简称,可以在等数据库上使用。一领域建模方式有三种领域建模方式和可以通过类来描述模型,然后通过类来创建数据库,这种类简称为。中的是指公共语言运行时,中的一个简单对象。 零、什么是Entity Framework Entity Framework (简称EF),是.NET的 Object/Relational Mapping 实体框架(简称ORM),可以在 SQL...
摘要:零什么是简称,是的实体框架简称,可以在等数据库上使用。一领域建模方式有三种领域建模方式和可以通过类来描述模型,然后通过类来创建数据库,这种类简称为。中的是指公共语言运行时,中的一个简单对象。 零、什么是Entity Framework Entity Framework (简称EF),是.NET的 Object/Relational Mapping 实体框架(简称ORM),可以在 SQL...
摘要:约定,类似于接口,是一个规范和规则,使用定义约定来配置模型和规则。在这里约定只是记本规则,我们可以通过或者来进一步配置模型。约定的形式有如下几种类型发现约定主键约定关系约定复杂类型约定自定义约定零类型发现约定在中。 约定,类似于接口,是一个规范和规则,使用Code First 定义约定来配置模型和规则。在这里约定只是记本规则,我们可以通过Data Annotaion或者Fluent A...
摘要:约定,类似于接口,是一个规范和规则,使用定义约定来配置模型和规则。在这里约定只是记本规则,我们可以通过或者来进一步配置模型。约定的形式有如下几种类型发现约定主键约定关系约定复杂类型约定自定义约定零类型发现约定在中。 约定,类似于接口,是一个规范和规则,使用Code First 定义约定来配置模型和规则。在这里约定只是记本规则,我们可以通过Data Annotaion或者Fluent A...
阅读 3058·2021-09-28 09:34
阅读 999·2021-09-27 13:34
阅读 741·2021-09-13 10:25
阅读 400·2019-08-30 15:52
阅读 3308·2019-08-30 13:48
阅读 532·2019-08-30 11:07
阅读 2053·2019-08-29 16:23
阅读 1881·2019-08-29 13:51