在前篇CodeFirst类型约定中,我们在数据库中为每一个模型类创建一个表,但是有个问题,我们可以设计出带继承关系的模型类,即面向对象编程既有“has a”(表示类继承)也有“is a”(表示类包含)关系,但是SQL的基础关系模型在表与表中仅支持"has a"关系,SQL数据库管理系统不支持继承类型。所以,怎样用关系型数据库来映射面向对象模型呢?

Code-First中有下面三种不同的方法来表示一个继承的层次结构:

  • Table per Hierarchy (TPH): 这种方法建议用一张表来表示继承层次结构,即这张表里包含了两个有继承关系类的鉴别列。看如下代码
public abstract class BillingDetail
{
public int BillingDetailId { get; set; }
public string Owner { get; set; }
public string Number { get; set; }
} public class BankAccount : BillingDetail
{
public string BankName { get; set; }
public string Swift { get; set; }
} public class CreditCard : BillingDetail
{
public int CardType { get; set; }
public string ExpiryMonth { get; set; }
public string ExpiryYear { get; set; }
} public class InheritanceMappingContext : DbContext
{
public DbSet<BillingDetail> BillingDetails { get; set; }
}

BankAccount类和CreaditCard类都继承于BillingDetail,在数据库中会生成如下表:

在EF中这是默认的继承映射层级结构

  • Table per Type (TPT): 这个方法建议为每一个模型类写一个分离的表。如下图所示:

代码如下:

public abstract class BillingDetail
{
public int BillingDetailId { get; set; }
public string Owner { get; set; }
public string Number { get; set; }
} [Table("BankAccounts")]
public class BankAccount : BillingDetail
{
public string BankName { get; set; }
public string Swift { get; set; }
} [Table("CreditCards")]
public class CreditCard : BillingDetail
{
public int CardType { get; set; }
public string ExpiryMonth { get; set; }
public string ExpiryYear { get; set; }
} public class InheritanceMappingContext : DbContext
{
public DbSet<BillingDetail> BillingDetails { get; set; }
}
  • Table per Concrete class (TPC): 这个方法建议除了抽象类,一个实体类对应一个表。所以,如果有多个实体类继承于抽象类,抽象属性将会成为每个实体类对应的表的一部分。如下图:

代码:

public abstract class BillingDetail
{
public int BillingDetailId { get; set; }
public string Owner { get; set; }
public string Number { get; set; }
} public class BankAccount : BillingDetail
{
public string BankName { get; set; }
public string Swift { get; set; }
} public class CreditCard : BillingDetail
{
public int CardType { get; set; }
public string ExpiryMonth { get; set; }
public string ExpiryYear { get; set; }
} public class InheritanceMappingContext : DbContext
{
public DbSet<BillingDetail> BillingDetails { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<BankAccount>().Map(m =>
{
m.MapInheritedProperties();
m.ToTable("BankAccounts");
}); modelBuilder.Entity<CreditCard>().Map(m =>
{
m.MapInheritedProperties();
m.ToTable("CreditCards");
});
}
}

上面说的比较简单,如果想要了解更多详细信息,点击下面的是三个链接:

  1. Inheritance with EF Code First: Table per Hierarchy (TPH)
  2. Inheritance with EF Code First: Table per Type (TPT)
  3. Inheritance with EF Code First: Table per Concrete class (TPC)

总结:这一节我也看得一知半解,如果有大神肯指点迷津,不胜感激。

最新文章

  1. crontab 启动 、运行 和编辑 查看
  2. [LeetCode] Third Maximum Number 第三大的数
  3. 前端网站helper
  4. vmstat的使用(查看系统各种负载)
  5. 科技部专家王涌天:移动AR头显将“让人类重新站起来”
  6. 【BZOJ2473/2120】维护队列 分块+二分
  7. PHP类与继承
  8. BZOJ1722 [Usaco2006 Mar] Milk Team Select 产奶比赛
  9. TImage 的一些操作
  10. apache-maven-3.3.9集成apache-tomcat-7.0.72实现热部署配置细节
  11. 【cocos2d-js公文】十七、事件分发机制
  12. MVC源码解析 - 目录
  13. andrroid 测试那点事
  14. RNN探索(2)之手写数字识别
  15. BZOJ3275Number——二分图最大权独立集
  16. lodash学习资料
  17. bzoj3262(cdq分治模板)
  18. Angular动态表单生成(六)
  19. MathType中如何快速输入空心字母
  20. golang笔记:net/smtp

热门文章

  1. Java异常处理设计(三)
  2. FF笔试题
  3. 移动 Ubuntu16.04 桌面左侧的启动器到屏幕底部
  4. dart之旅(一)
  5. 全网最详细的Eclipse和MyEclipse里对于Java web项目发布到Tomcat上运行成功的对比事宜【博主强烈推荐】【适合普通的还是Maven方式创建的】(图文详解)
  6. JVM内存区域划分及垃圾回收
  7. Lucene 7.2.1 自定义Analyzer和TokenFilter
  8. 精读JavaScript模式(四),数组,对象与函数的几种创建方式
  9. JavaWeb学习 (十九)————JavaBean
  10. .Net Core中使用Quartz.Net