博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EF-CodeFirst 继承关系TPH、TPT、TPC
阅读量:7080 次
发布时间:2019-06-28

本文共 2263 字,大约阅读时间需要 7 分钟。

继承关系

面向对象的三大特征之一:继承 ,在开发中起到了重要的作用。我们的实体本身也是类,继承自然是没有问题。下面开始分析 EF里的继承映射关系TPH、TPT、TPC

现在我们有这样一个需求,用户里要有一批超级用户,他们有着与生具来的优越。可以体验到更高级的服务。但是超级用户也是用户,可以去继承我们的普通用户类 (其实个人感觉不是很合理,因为我们有UserRole表,给一个超级用户的角色就可以了。这里仅做演示)

///     /// 超级用户    ///     public class SuperUser : User    {        ///         /// 超级用户卡号        ///         public string UserNum { get; set; }    }

TPH (Table Per Hierarchy)

TPH是EF中默认的继承映射关系, 我们现在直接Update-DataBase看一下表的结构是什么样的

 

可以看到,并没有生成另一张表,而是把SuperUser的属性加到了User表中,等待,貌似多出来一个Discriminator。其实他是用来标识记录是来自哪个实体的。下面做个测试,分别用User和SuperUser实体向表里插入一条数据

using (Entites aContext = new Entites()){                    Core.User.User user = new User()     {          Name = "小明",          UserAddress = new UserAddress() { City = "北京", DynamicAddress = "北京知春路" }     };      aContext.User.Add(user);      Core.User.SuperUser superUser = new SuperUser()      {           Name = "超级小明",           UserNum = "12346789",           UserAddress = new UserAddress() { City = "北京", DynamicAddress = "北京798艺术区" }      };       aContext.User.Add(superUser);       aContext.SaveChanges(); }

 

可以看到Discriminator分别标识了来自什么实体

 

其实我们也可以自己去配置,包含字段名和值都可以控制

public class UserMap : EntityTypeConfiguration
{ public UserMap() { Map
(u => u.Requires("From").HasValue("From-Super")); Map
(u => u.Requires("From").HasValue("From-User")); } }

 

 

TPT  (Table per Type)

这个方式是值得推荐的,子类和父类在不同的表中。子类的表只拥有子类的属性。通过相同Id来关联User表

可以在类上直接 Table(“xxx”),也可以使用 Fluent Api。

public class UserMap : EntityTypeConfiguration
{ public UserMap() { Map
(u => u.ToTable("T_SuperUser")); } }

Update-DataBase一下,看看表结构

 

再插入数据看一下

 

 

TPC (Table Per Concrete Type)

这个。。。真的很不想说。存在即合理,还是简单说一下使用方式吧。。使用这种方式父类的属性在子类的表中也会存在。(恶心)  我就不生成了,,看着恶心。。。

public class UserMap : EntityTypeConfiguration
{ public UserMap() { Map
(u=>{
u => u.ToTable("T_SuperUser"));
u.MapInheritedProperties();            })
}    }

 

结束之语

之前使用复杂类型的时候,我就说过他的某些不好。因为代码上分开了,但是实际表中还是在一起的。TPT的方式很符合我的胃口。也是我一直在想要的扩展表的方式。当然都各有千秋,还是看实际项目的需求。存在即合理,说不定哪一天我也会用上恶心的TPC也说不定

转载于:https://www.cnblogs.com/LiangSW/p/5816181.html

你可能感兴趣的文章
SpringBoot-06:SpringBoot增删改查一套完整的考试案例
查看>>
xtrabackup: error: last checkpoint LSN (3409281307) is larger than last copied LSN (3409274368). #2
查看>>
关于NoClassDefFoundError和ClassNotFoundException异常
查看>>
一、Autofac入门
查看>>
HTML 总结
查看>>
C# 随机列表
查看>>
C# 文件的读取与另存为(WPF)
查看>>
poj1129
查看>>
socket 简历网络连接
查看>>
App.Config操作
查看>>
并查集(涂色问题) HDOJ 4056 Draw a Mess
查看>>
20151217:Web之Repeater使用:主页面
查看>>
从一次浅尝则止的代码优化说起(一) 简单的异常分离
查看>>
BZOJ1834:[ZJOI2010]网络扩容——题解
查看>>
76.培训记录信息 Extjs 页面
查看>>
7.Maven之(七)pom.xml配置文件详解
查看>>
如何成为一名黑客
查看>>
[置顶] openHAB 部分代码结构 UML 图
查看>>
网址探测器 - 零基础入门学习Delphi41
查看>>
批量导入数据一定得有回滚方案
查看>>