首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

实体框架4 - 代码优先不存储与基表分开的继承表

实体框架4(Entity Framework 4)是一个用于.NET语言的对象关系映射(ORM)框架,它可以将关系型数据库表映射到对象模型,并提供了一组API来实现对数据库的增删改查操作。

代码优先(Code First)是实体框架4中的一种开发模式,它允许开发人员通过编写C#或VB.NET代码来定义数据库表结构,实体框架会根据这些代码自动生成相应的数据库表。这种方式可以让开发人员更加专注于业务逻辑,而不需要花费大量时间在数据库设计上。

在代码优先模式下,如果需要将继承关系的实体类存储到单独的表中,可以使用表分区(Table Splitting)的方式来实现。表分区是指将一个实体类映射到多个数据库表,其中每个表包含实体类的一部分属性。这种方式可以将与继承关系有关的属性存储到与基表分开的继承表中,以实现更好的数据库设计。

以下是一个使用实体框架4代码优先模式实现表分区的示例:

代码语言:csharp
复制
public class BaseEntity
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class DerivedEntity1 : BaseEntity
{
    public string Property1 { get; set; }
}

public class DerivedEntity2 : BaseEntity
{
    public string Property2 { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<BaseEntity> BaseEntities { get; set; }
    public DbSet<DerivedEntity1> DerivedEntities1 { get; set; }
    public DbSet<DerivedEntity2> DerivedEntities2 { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<BaseEntity>().ToTable("BaseTable");
        modelBuilder.Entity<DerivedEntity1>().ToTable("DerivedTable1");
        modelBuilder.Entity<DerivedEntity2>().ToTable("DerivedTable2");

        modelBuilder.Entity<DerivedEntity1>().HasRequired(e => e.BaseEntity).WithOptional();
        modelBuilder.Entity<DerivedEntity2>().HasRequired(e => e.BaseEntity).WithOptional();
    }
}

在这个示例中,我们定义了一个基类BaseEntity和两个派生类DerivedEntity1DerivedEntity2,并使用ToTable方法将它们映射到不同的数据库表中。同时,我们还使用HasRequiredWithOptional方法来指定继承关系,以实现表分区。

总之,实体框架4的代码优先模式可以让开发人员更加方便地定义数据库表结构,而表分区可以让开发人员更好地组织和存储继承关系的实体类。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

ORM中的继承关系映射全解——单表继承体系、一实体一具体表、一实体一扩展表、接口映射

一实体一具体表 3. 一实体一扩展表 4. 接口实现映射vs基类继承映射 1. 单表继承体系 所谓单表继承体系就是用一张数据库表存储整个继承体系中的所有实体的数据。...NULL字段值的数据,浪费了一些存储空间,同时,如果记录数过多,表就会更庞大,也会影响表的读写性能。 ...一实体一扩展表 所谓一实体一扩展表是指继承体系中的每个实体对应一张数据表,但是,每个子类不冗余包含父类的所有属性,而只是包含扩展的属性和共享的主键值。...注,这里的接口因为主要是讨论实体定义,因此,不涉及包含方法定义的接口,这里只关注包含需要持久化的实体属性接口。  我们知道,实现一个接口和继承一个基类是不同的OO语义。...我们常常发现,当按照传统的单继承的思路来设计继承体系时,尤其是,当脑袋中一直包含着让模型更适合使用ORM框架来持久化时,我们往往会忽略接口,而过度依赖基类继承。

2.5K90

SQL反模式学习笔记6 支持可变属性【实体-属性-值】

2、实体表继承:为每个子类型创建一张独立的表,每个表包含哪些属于基类的共有属性,同时也包含了子类型特殊化的属性。...优点:(1)实体继承类设计相比于但表继承设计的优势在于提供了一种方法, 让你能组织在一行内存储一些和当前子类型无关的属性。...(2)不用像在单表继承设计里那样使用额外的属性来标记子类型。 缺点:很难将通用属性和子类特有属性区分开来。...当你很少需要一次性查询多有子类型时,实体继承表设计是最好的选择。   3、类表继承:把表当成面向对象里的类。 创建一张基类表,包含所有子类型的公共属性。...4、半结构化数据模型:如果有很多子类型或者必须经常增加新的属性支持,那么可以用一个BLOB列来存储数据, 用XML或者JSON格式——

1.2K20
  • 01-EF Core笔记之创建模型

    EF是实体框架,它的实体会映射到关系型数据库中。所以通过关系型数据库的表之间的关系更容易理解实体的关系。...继承 关于继承关系如何在数据库中呈现,目前有三种常见的模式: TPH(table-per-hierarchy):一张表存放基类和子类的所有列,使用discriminator列区分类型,目前EF Core...仅支持该模式 TPT(table-per-type ):基类和子类不在同一个表中,子类对应的表中仅包含基类表的主键和基类扩展的字段,目前EF Core不支持该模式 TPC(table-per-concrete-type...):基类和子类不在同一个表中,子类中包含基类的所有字段,目前EF Core不支持该模式 EF Core仅支持TPH模式,基类和子类数据将存储在同一个表中。...实体构造函数 EF Core支持实体具有有参的构造函数,默认情况下,EF Core使用无参构造函数来实例化实体对象,如果发现实体类型具有有参的构造函数,则优先使用有参的构造函数。

    3.1K20

    【C++】继承

    菱形继承后,BC派生类中各自存储虚基类成员,这就导致了数据冗余。现在的虚基类成员是4字节,可是如果虚基类成员100字节呢?或者更多呢?则派生类各存储一份,数据冗余带来的消耗就会更大。 3....虚拟继承后,BC派生类中不再存储虚基类成员,改为存储虚基表指针,虚基表指针指向的一张表叫做虚基表,这个表中存储了派生类成员到虚基类成员的地址偏移量,通过偏移量就可以找到虚基类成员的内存地址。...B成员里面多存储的一份虚基表指针来进行寻找。...//模型上来说,把虚基类对象放到最下面,喜欢把有效内容上方的地址所指向的表叫做虚基表,虚基表中存储的是偏移量 //Java直接就不支持多继承,这样根本就没有菱形继承这样的存在,不会引发大坑的出现了就。...继承在一定程度上破坏了基类的封装,基类的改变,对派生类有很大的影响。派生类和基类间的依赖关系很强,耦合度高。 4. 对象组合是类继承之外的另一种代码复用选择。

    71010

    《Entity Framework 6 Recipes》翻译系列 (1) —–第一章 开始使用实体框架之历史和框架简述「建议收藏」

    不久之后,实体框架的开发团队发布了三个小的版本-4.1到4.3,提供了另一种叫做“代码优先(Code First)”的方案。...现在实体框架已经到了版本6.0,提供了查询和更新的异步支持,在代码优先(Code First)中,存储过程支持更新,性能改进,以及一系列的新特性,本书将聚焦这些新特性。...图1-2 实体数据模型  在图1-2中,展示了左边的数据库表不直接映射到右边的实体类型(代码中使用)的。...术语   实体框架有自己的词汇表,如果你已经使用别的流行的ORM工具或者与之相似的数据库模型,也许,在这之前你已经遇到一些词汇。...更有趣的是,开发团队可以利用实体框架的强大的实用工具(可以从微软官方网站下载)从一个存在的数据库中逆向生成代码优先模型。

    1.4K20

    充血模型的ORM能做什么?——ORM组件XCode(十八般武艺)

    实体集合还提供了一些方便查询和排序的简便方法,实体缓存中将会大量使用。 4、万能的一级缓存 一级缓存由数据访问层实现,以查询SQL为键,返回的数据集为值,查询的表名数组为依赖项,进行缓存。...单表数据量不大(建议1000以下,不超过10000),并且极少改动的数据表使用实体缓存。比如权限、角色、菜单、系统参数等使用非常频繁的数据。...数据库操作类以Access数据库为蓝本,设计了一个基类,其它数据库操作类仅需要继承该类,重载功能点不一致的属性和方法,大大减小了操作类的大小。...17、实体类的继承与重载 (NewLife.CommonEntity) 通过改变泛型参数的具体类型,实现实体类的继承和重载,是XCode进入第三代的标志。...具体项目可以直接使用它们,也可以通过继承与重载来实现扩展。 以封装的地区表为例,它在静态构造函数中检测数据表行数,当然,在这之前XCode会自动检测并创建地区表。

    1.2K90

    Entity Framework 4.1 Code-First 学习笔记

    CodeFirst提供了一种先从代码开始工作,并根据代码直接生成数据库的工作方式。Entity Framework 4.1在你的实体不派生自任何基类、不添加任何特性的时候正常的附加数据库。...,EF就会为我们创建一个订单与员工的对应关系表(OrderEmployee),这张表中有两个字段:员工ID(Employee_EmployeeID)与订单ID(Order_OrderID)。...每个类型一张表 TPT: 在继承层次中的每个类都分别映射到数据库中的一张表,彼此之间通过外键关联。...继承层次中所有的类型一张表 TPH:对于继承层次中的所有类型都映射到一张表中,所有的数据都在这张表中。...为了模拟实际的业务需求,我定义了一个简单的继承层次,一个抽象基类和两个派生类,代码如下: publicabstractclass PersonBase { publicint PersonID {

    1.6K10

    Rafy(原OEA)领域实体框架 2.22.2067 发布!

    不包含“界面自动生成”等其它组件。 安装新的发布包:《使用 NuGet 下载最新的 Rafy 框架及文档》。...同时,这些属性的 API 直接公布,更方便开发人员编写面向自己应用的框架。 仓库基类则实现了组合实体的添加、删除、修改,并提供了大量的默认查询。...Rafy 框架的快速开发思想之一是支持默认值,尽量少使用配置。在必要时,仅需非常少的配置即可达到运行时的灵活变化。 •    稳定、质量有保障 领域实体框架的代码行有 4 万多行。...优势 与 EF、NH 等传统 ORM 框架相比,使用 Rafy 领域实体框架的优势在于: 传统 ORM 只是为了解决面向对象与关系数据库的映射,而 Rafy 解决的是领域实体与关系数据库的映射。...(面向对象的映射解决的是一般性的实体关系到数据库的映射,包含:一对多、一对一、多对多、继承。而领域实体的映射,则专注于领域驱动设计中的继承关系、聚合关系、引用关系。

    2K100

    《OEA - 实体扩展属性系统 - 设计方案说明书》

    附件:《实体扩展属性系统-系统设计说明书.pdf》 ================= 分隔线 ====================== 目录 前言... 4 1 背景与需求... 5 1.1...l 另外,我们的产品基于实体开发,为实现动态列的需求绕了许多路,最终决定使用数据表的模式来编写,同样造成大量重复代码,开发人员开发效率低下。 基于历史遗留的这些问题,我们设计了全新的属性系统。...ManagedPropertyObject 表示拥有托管属性的对象基类(实体),其中定义了根据ManagedProperty来获取、设置值的接口,这使得该对象能够象一般对象一样获取、存储各种值。...接下来,说明一些相对重要的代码: l 先是ManagedPropertyObject中的属性值获取、设置相关代码: ? 前面的设计方案中提到,这个类主要作为所有实体类的基类,提供值的获取、设置等。...而 ManagedPropertyObjectFieldsManager则实现了这些逻辑的核心代码。其中,它的私有字段定义如下: ? 可以看到,编译期、启动期属性值与运行期属性值被分开存放。

    1.9K71

    C++【多态】

    ,可以看到涉及虚函数类的对象中都有属性 __vfptr(虚表指针),可以通过虚表指针所指向的地址,找到对应的虚表 虚函数表中存储的是虚函数指针,可以在调用函数时根据不同的地址调用不同的方法 在下面这段代码中...虚表指针指向虚表,虚表中存储的是虚函数地址,而 32 位平台中指针大小为 4 字节 因此可以先将虚表指针强转为 指向首个虚函数 的指针,然后遍历虚表打印各个虚函数地址验证即可 vs 中对虚表做了特殊处理...中初始化的 虚表一般存储在 常量区(代码段),有的平台中可能存储在 静态区(数据段) 通过一段简单的代码验证 虚表的存储位置 int main() { //验证虚表的存储位置 Person p;...虚继承 + 虚基表 的相关概念,那么在多态的加持之下,菱形继承多态变得更加复杂:需要函数调用链路设计的更加复杂 菱形虚拟继承多态就更不得了:需要同时考虑两张表:虚表、虚基表 虚基表中空余出来的那一行是用来存储偏移量的...( ) A:一个类只能有一张虚表 B:基类中有虚函数,如果子类中没有重写基类的虚函数,此时子类与基类共用同一张虚表 C:虚表是在运行期间动态生成的 D:一个类的不同对象共享该类的虚表 4.下面程序输出结果是什么

    14630

    一文读懂C++虚继承的内存模型

    对于一个独立开发的类来说,很少需要基类中的某一个类是虚基类,况且新类的开发者也无法改变已经存在的类体系。 4、虚继承在标准库中的使用 C++标准库中的iostream就是一个虚继承的典型案例。...~ _vptr.B这个范围内的数据都是类B虚表的内容(不知道编译器为什么这么设计,这里也进行揣测了),这三个特殊的内存地址存储的内容解析如下: _vptr.B - 1:这里存储的是typeinfo for...很简单,定义一个析构函数,用virtual修饰即可) _vptr.B - 3:这里存储的是vbase_offset,这个表示的是当前虚表指针与其对应的虚基类的距离。...因此,需要在虚表中额外再提供一个实体,表明运行时它的基类所在的位置,这个实体称为vbase_offset,位于offset_to_top上方。...,如图5-3所示: 图5-3 虚表内存信息 从图5-3中可以看出前面的内存图是正确的,接下来就再看一下变量d自身的内存布局,如图5-4所示: 图5-4 变量d的内存布局 图5-4显示出的结果和前面图

    1.4K20

    编译器角度看C++复制构造函数

    实施这些步骤并不在函数实体内。 类不展现Bitwise copy语意 当类不展现出Bitwise copy语意且类设计者没有为类定义一个复制构造函数,这时编译器就会为合成一个复制构造函数实体。...当类继承于一个基类而后者有已给复制构造函数时(同样的,无论基类的构造函数是设计者明确声明的还是合成的)。 当类声明了一个或多个虚函数时。 当类派生自一个继承串链,其中有一个或多个虚基类时。...后两种操作涉及到了虚表指针与虚基类指针的产生于初值设置。...我们知道,当一个类含有虚函数时(无论这虚函数是类本身定义还是继承而来),在编译期间会有以下两个程序扩张操作: 为类增加一个虚表(virtual function table),虚表内含有每一个有作用的虚函数的地址...而对于第4点涉及到虚基类的情况,可以看C++合成默认构造函数的真相中有关虚基类的描述。

    60670

    新生命开发团队Orm框架XCode v3.5.2009.0714源码发布(圣诞随心大礼包)

    ,所继承的基类本身也是泛型类。...比如管理员实体类,在实体类的静态构造函数中,检查管理员表的数据,如果数据行数为0,表明没有任何数据,这个时候,代码将创建一个用户名和密码都是admin的默认管理员,并写入数据表。...页面上没有太多的实现代码,甚至在通用实体类组件里面的菜单基类,也没有太多的代码,因为菜单基类也是继承自树形实体基类EntityTree,后面的客户类别属于树形实体,也是继承自它。 ?    ...的数据改变事件,并使用弱引用,当该实体有数据改变后,触发事件,可用于在外部清楚该对象的缓存 * (重要更新)实体基类增加字典缓存Extends,用于存储扩展属性,并增加专属的...GetExtend方法用于获取扩展属性,向依赖实体类注册数据更改事件 * (重要更新)实体树类升级为实体树基类,所有具有树形结构数据的实体类,继承自该类,享受树形实体的各种功能

    1.6K70

    CC++ 技术面试基础知识总结

    C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现 虚继承 虚继承用于解决多继承条件下的菱形继承问题(浪费存储空间、存在二义性)。...底层实现原理与编译器相关,一般通过虚基类指针和虚基类表实现,每个虚继承的子类都有一个虚基类指针(占用一个指针的存储空间,4字节)和虚基类表(不占用类对象的存储空间)(需要强调的是,虚基类依旧会在子类里面存在拷贝...实际上,vbptr 指的是虚基类表指针(virtual base table pointer),该指针指向了一个虚基类表(virtual table),虚表中记录了虚基类与本类的偏移地址;通过偏移地址,...这样就找到了虚基类成员,而虚继承也不用像普通多继承那样维持着公共基类(虚基类)的两份同样的拷贝,节省了存储空间。...虚继承、虚函数 相同之处:都利用了虚指针(均占用类的存储空间)和虚表(均不占用类的存储空间) 不同之处: 虚继承 虚基类依旧存在继承类中,只占用存储空间 虚基类表存储的是虚基类相对直接继承类的偏移

    1.8K20

    移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——10.继承

    1.由图可知,由虚拟继承所得,B.C.D都含有同一个A(存储在最下方) 2.先来看B:   2.1 第二行存储的是d继承的B中的_b的数值 2.2 第一行存储的是虚基表指针 3....再来看B中存储的虚基表指针   由第一行得,指针指向的地址为00bc5f50;    3.1 第一行什么都没存储   3.2  第二行存储的是虚基表指针到A的距离(偏移量)!!!!!!!!!!!...再回到虚基表第二行存储的偏移量是16进制下的14,转换为十进制为16+4=20 可得:偏移量和两地址间的距离相等!!!!!!!!!!!!!!!!!!!!...3.优先使用对象组合,而不是类继承 。 4.继承允许你根据基类的实现来定义派生类的实现。这种通过生成派生类的复用通常被称 为白箱复用(white-box reuse)。...优先使用对象组合有助于你保持每个类被 封装。 6.实际尽量多去用组合。组合的耦合度低,代码维护性好。不过继承也有用武之地的,有 些关系就适合继承那就用继承,另外要实现多态,也必须要继承。

    7210

    22个高级Python知识点总结,干货!

    NO.4 魔法函数 Python中的魔法函数使用双下划线开始,以双下划线结尾 No.5 鸭子类型与白鹅类型 鸭子类型是程序设计中的推断风格,在鸭子类型中关注对象如何使用而不是类型本身。...判定某个对象的类型 强制子类必须实现某些方法 抽象基类的定义与使用 ?...2.2 及其之前类没有基类,Python新式类需要显式继承自object,即使不显式继承也会默认继承自object 经典类在类多重继承的时候是采用从左到右深度优先原则匹配方法的.而新式类是采用C3算法...super()函数用来调用MRO(类方法解析顺序表)的下一个类的方法。 No.14 Mixin继承 在设计上将Mixin类作为功能混入继承自Mixin的类。...属性访问的优先规则 对象的属性一般是在__dict__中存储,在Python中,__getattribute__()实现了属性访问的相关规则。

    1K00

    EF基础知识小记一

    (Model First) 版本4.1~4.3:实现了"代码优先"的方案....,在代码优先(Code First)中,存储过程支持更新,性能改进,以及一系列的新特性,本书将聚焦这些新特性 4、模型 实体框架是一个强烈关注建模的技术,实体框架创建的是实体数据模型(EDM)的模型,它允许你在编码时使用强类型的实体类...在图1-2中,展示了左边的数据库表不直接映射到右边的实体类型(代码中使用)的。...实体数据模型中的映射能力使开发者可以使用与问题域(problem domain)高度一至的实体类型集,替代高度结构化的数据库。以设计出高性能、可伸缩、可维护的代码。   ...:将应用程序中的对象映射到某一存储系统中,实体框架中的数据模型定义表、列,关系以及映射到底层数据库中的数据类型.存储架构定义语言(SSDL)定义了存储模型的语法。

    1.7K90

    【BCVP升级】泛型主键的使用

    普通实体模型继承基类,并传递参数 刚刚已经定义好了泛型基类,那现在我们来设计下实体类,这里有两个情况,一种是普通的类结构,比如角色表自己不和其他交互,只有主键Id,另一种是有外键的复杂的类结构,比如用户角色表中...... } 这里用角色表Role举例,直接继承父类RootEntityTkey,然后定义该实体除主键以外的属性和字段等即可,还是很简单的,也是很普通的写法。...,如果单纯的继承RootEntityTkey肯定是不行的,因为如果这么操作了,这个关系表中肯定就不能和User表或者Role表保持一致了,所以这三个字段都应该设计成泛型的格式,那如何设计的?...我参照着实体泛型基类,又单独针对特定的有外键需求的实体,抽离了一个中间父类,请注意我的命名:实体类-->父类(非必须)-->泛型基类,用UserRole来举例。...: 核心的就是RootTkey这个文件夹下,就是这次修改的主要部分,其他的实体模型基本不用修改,只需要继承特定的专属父类/基类即可: RootEntityTkey。

    69110

    解锁C++继承的奥秘:从基础到精妙实践(下)

    虚基指针指向 虚基表(vbtable),虚基表中存储了虚基类的实际内存偏移量。通过查找 vbtable,编译器可以在运行时计算出虚基类的地址,并进行指针调整。...虚拟继承与普通继承的一个主要区别在于,虚拟继承需要通过虚基表(vtable) 或 指针调整 机制来处理基类的实例,而这些操作会影响对象的内存布局,并最终反映在编译后的汇编代码中。...下面将介绍虚拟继承与汇编之间的关系,特别是它如何影响内存布局、虚基表以及指针调整。 7.1 虚拟继承的内存布局 在普通继承中,派生类会直接包含基类的成员。...虚基类成员不直接出现在派生类中,而是通过 vbptr 间接访问。 7.2 虚基表(vbtable)与指针调整 在虚拟继承中,C++编译器使用 虚基表 来解决多路径继承带来的二义性问题。...[eax+4]:通过虚基表指针 vbptr 获取 A 在派生类 B 中的实际位置偏移量。 [ebp+ecx]:最终通过计算的偏移量访问 A::a。

    6510

    ASP.NET MVC5高级编程——(3)MVC模式的模型

    5 什么是实体框架,什么是代码优先和数据上下文? 新建的ASP.NET MVC5项目会自动包含对实体框架(EF)的引用。...代码优先是指可以在不创建数据库模式、也不打开Visula Studio设计器的情况下,向SQL Server中存储或检索信息。...这个MvcMusicStoreDB是继承了DbContext,其作用概括来说:对模型类的修改会反映到数据库中,反之亦然,对数据库的修改也会反映到模型类中。EF实体框架会使用数据迁移来帮我们完成。...4.执行基架代码 4.1用实体框架创建数据库--local-DB虚拟数据空间 EF框架的代码优先方法会尽可能地使用约定而非配置(即MVC中的约定优于配置)。...注意这里除了三个model类对应的表,还有个__MigrationHistory表,EF框架使用这个表来维护代码优先模型和数据库模式一致!如果删除了这个表,就需要我们自己来维护数据库模式的修改。

    4.8K40
    领券