首页
学习
活动
专区
工具
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

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

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

    1.4K20

    【C++】继承

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

    69910

    充血模型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 解决是领域实体关系数据库映射。...(面向对象映射解决是一般性实体关系到数据库映射,包含:一对多、一对一、多对多、继承。而领域实体映射,则专注于领域驱动设计中继承关系、聚合关系、引用关系。

    1.9K100

    《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.下面程序输出结果是什么

    14030

    一文读懂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.2K20

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

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

    60070

    EF基础知识小记一

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

    1.7K90

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

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

    1.6K70

    移情别恋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.实际尽量多去用组合。组合耦合度低,代码维护性好。不过继承也有用武之地,有 些关系就适合继承那就用继承,另外要实现多态,也必须要继承

    7110

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

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

    96400

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

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

    1.7K20

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

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

    5410

    【BCVP升级】泛型主键使用

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

    68710

    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
    领券