三种继承模式
Table per Type(TPT)继承 一个表对应一个类型
Table per Class Hierarchy(TPH)继承 一个表对应一个类的层级(父类和子类的集合)
Table per Concrete Class(TPC)继承 一个表对应一个实体类(忽略虚类)
定义一个虚类Person ,并继承出两个子类
public abstract class Person //虚类
{
public int Id { get; set; }
[MaxLength(20, ErrorMessage = "名称长度不能大于8")]
public string Name { get; set; }
public string remark { get; set; }
}
[Table("Employee")]
public class Employee : Person
{
public decimal Salary { get; set; }
}
[Table("Vendor")]
public class Vendor : Person
{
public decimal HourlyRate { get; set; }
}
TPH继承
DBContext这么写
class MyContext : DbContext
{
public virtual DbSet<Person> Peoples { get; set; }
public DbSet<Vendor> Vendors { get; set; }
public DbSet<Employee> Employees { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
string sqlServerConnStr = "xxx";
optionsBuilder.UseSqlServer(sqlServerConnStr);
base.OnConfiguring(optionsBuilder);
}
}
将会在数据库创建一张表 Peoples 包含列: Id,Name,remark,Salary,HourlyRate,Discriminator
其中列Discriminator是EF自动产生用来区分Employee或者Vendor ;字段的取值也是Vendor或Employee
TPC继承
DBContext如果这么写
class MyContext : DbContext
{
// public virtual DbSet<Person> Peoples { get; set; } //不要这句
public DbSet<Vendor> Vendors { get; set; }
public DbSet<Employee> Employees { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
string sqlServerConnStr = "xxx";
optionsBuilder.UseSqlServer(sqlServerConnStr);
base.OnConfiguring(optionsBuilder);
}
}
将会在数据库创建两张表Employee和Vendor包含列:
Employee: Id,Name,remark,Salary
Vendor: Id,Name,remark,HourlyRate
TPC继承产生的两张表的主键会重复,导致EF使用Person的时候产生主键冲突,所以不推荐使用这种方式
第一种TPT继承就是在数据库产生三张表,具体做法可以自行研究一下
分享到:
相关推荐
在EF中,有三种主要的开发模式:Code First、Model First 和 Database First。本篇文章将重点介绍Code First开发方式,这是一种基于代码的开发模型,特别适合敏捷开发和持续集成的项目。 Code First开发方式的核心...
在EF中,有三种主要的编程模式:CodeFirst、ModelFirst和DatabaseFirst。本篇文章将重点探讨CodeFirst这一模式。 **CodeFirst**是EF开发的一种流行方式,它的核心理念是从代码出发,即首先编写C#类和数据模型,然后...
3. 三层架构:三层架构是一种分层的软件设计模式,通常包括表示层(用户界面)、业务逻辑层(处理业务规则和验证)和数据访问层(与数据库交互)。在这个案例中,MVC的Controller可以视为表示层,业务逻辑层可能包含...
总结来说,EF Code First模式为.NET开发者提供了一种简洁、高效的数据库开发方式,通过代码驱动数据库设计,使得开发过程更加灵活且易于维护。结合数据迁移功能,开发者能够轻松地管理数据库结构的变更,从而专注于...
.NET EF业务框架是一种基于Entity Framework(EF)设计的软件架构,它在传统的三层架构(数据访问层、业务逻辑层、表现层)的基础上进行了扩展和优化。这个框架的主要目的是提高开发效率,提供更好的代码组织和可...
在IT行业中,三层架构是一种常见的软件设计模式,它将应用程序分为三个主要部分:表现层(Presentation Layer)、业务逻辑层(Business Logic Layer)和数据访问层(Data Access Layer)。这种架构有助于提高代码的...
在本文中,我们将深入探讨如何使用ASP.NET MVC 5.2、Entity Framework 6.0 (EF6) 和 MySQL 数据库通过CodeFirst模式构建一个基本的增删改查(CRUD)应用程序。这个例子展示了如何将这三个技术有效地结合起来,以实现...
EF支持Code First、Database First和Model First三种开发模式,其中Code First模式在现代开发中被广泛应用,它允许开发者从C#类定义出发,自动生成数据库结构。 二、Autofac简介 Autofac是.NET平台上的一款轻量级、...
2. **上下文(DbContext):**这是EF的核心组件,它继承自System.Data.Entity.DbContext,负责管理数据库连接和数据操作。通过创建DbContext的子类,我们可以定义与数据库交互的实体和它们之间的关系。 3. **数据库...
MVC是一种软件设计模式,广泛应用于Web开发领域,尤其是ASP.NET平台。它将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。这种分离提高了代码的可维护性和可测试性。 1. **模型...
EF支持Code First、Database First和Model First三种开发模式。在这个案例中,我们可能采用了Code First,这是一种从C#代码定义模型开始的开发方式,通过EF的自动迁移功能,可以轻松地同步数据库结构。 项目中实现...
- **上下文(DbContext)**:上下文是EF的主要工作类,它继承自`DbContext`基类,包含了对数据库操作的所有信息,如实体集、连接字符串等。 - **数据模型(Data Model)**:数据模型是EF的核心,由实体类、映射...
首先,EF的核心理念是消除传统的ADO.NET代码,它通过提供一种高级的抽象层,允许开发人员以面向对象的方式操作数据。这意味着无需编写SQL语句,就可以完成数据的读取、插入、更新和删除操作。这种抽象简化了数据库...
在.NET开发中,Entity Framework(简称EF)是一个强大的对象关系映射(ORM)框架,它允许开发者使用C#等高级...学习和掌握EF的高级特性,如DbSets、导航属性、查询表达式以及仓储模式,将有助于更好地解决此类问题。
对于继承类型的映射,TPT模式会产生join连接而影响性能,TPH模式可以提升性能但牺牲了数据库灵活性。 复合类型是EF中的一个概念,它允许将一组属性包含到一个单独的类型中,这种类型可以包含标量属性和其他复合类型...
5. **仓储(Repository)和单元工作(Unit Of Work)模式**: 虽然EF本身已经实现了数据访问层,但开发者仍可以选择使用仓储和单元工作模式来进一步封装数据访问,以提高代码的可测试性和可重用性。 ### EF的工作...
3. **仓储接口(Repository Interfaces)**:仓储模式是设计模式中的一种,用于在应用程序和数据访问层之间提供一个抽象层。CodeSmith可以生成这些接口,以便于实现解耦和单元测试。 4. **仓储实现(Repository ...
MVC(Model-View-Controller)是一种设计模式,常用于Web应用开发,它将业务逻辑、数据和用户界面分离。MVC4.0是ASP.NET MVC框架的第四个主要版本,增加了许多新功能和改进,如移动支持、Bundling和Minification...
- **数据库第一、代码第一和模型第一**: EF支持三种开发模式:数据库优先(Database First)、代码优先(Code First)和模型优先(Model First),分别适应不同的开发流程。 **Bootstrap** Bootstrap是一个流行的...
接下来,我们详细讨论三种关系映射: ### 1. 一对一关系 一对一关系意味着两个实体之间存在一对一的对应关系。在 EF 中,可以通过 `HasRequired` 和 `WithOptional` 或数据注解 `[ForeignKey]` 来设置这种关系。...