EF 系列文章目录
文章目录
1. 前言
ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案。该框架曾经为.NET Framework的一部分,但version 6之后从.NET Framework分离出来。
ADO.NET Entity Framework 以 Entity Data Model (EDM) 为主,将数据逻辑层切分为三块,分别为 Conceptual Schema, Mapping Schema 与 Storage Schema 三层,其上还有 Entity Client,Object Context 以及 LINQ 可以使用。
2. Entity Framework 建模
Entity Framework 技术的应用中 ,可针对数据库中各个表按照1:1 映射生成模型和映射信息 ,在代码中直接对表中数据进行增、删、改、查操作,但在实际应用中,这种简单的处理方式不利于进一步降低程序开发工作量,部分情况还违背了“程序开发以应用为中心的概念模型来工作”的理念 ,对象的概念不清晰。为此 ,对几种常用的数据库情景的建模方法进行介绍。
2.1 带有有效载荷的多对多关系建模
在带有有效栽花的多对多关系数据库中 ,关系表除了主键外 ,还有其他数据字段。在这种关系中 ,直接把表映射到实体模型中 ,两实体表自动创建对应的实体类型 ,而关系表也被映射成为一实体类型 ,在此实体类型中除了原有属性名 ,还有对应两实体表的导航属性 ,可分别通过 1 对多关系进行对象导航。
2.2 自引用关系建模
对于分类表之类的自引用表 ,把表映射成为实体类型后 ,其中将包含两个导航属性 分别对应父、子对象 ,其中父对象为 1 端 ,多端为子对象集合 ,因此分别把 1 端改名为父端名称如Parent Category,多端改名为子对象集合名称如 Sub Categories。由此两导航属性可方便地访问到对应对象。
2.3 跨表实体建模
在数据库设计过程中 ,当一个实体的数据由于各种原因为分割在不同表中 ,而程序开发需要把实体所有数据集合在一个实体类型中。对于这种跨表实体的情况 ,建模时首先把所有的表都映射到实体模型中 ,然后调整实体类型 ,把主要表之外的其它表映射实体类中除主键对应属性外的所有属性复制到主要表映射实体类型中 ,然后删除主要表映射实体类型中的所有导航属性和其它表实体类型 ,在删除其它表实体类型时 ,不删除映射存储模型中的表 ,最后 ,在剩下的这一个表映射实体类型中 ,添加复制得到的所有属性的映射关系 ,分别映射到对应的表中的列。在实体操作过程中 ,映射关系能自动分别处理不同表中的对应数据。
2.4. 多实体建模
在表中如果有部分字段内容较多并且不常使用 ,为提高程序性能 ,访问表时,一般只访问表中的部分字段, 为此 ,建模时必须把表分割成多个实体。首先把表映射成一般实体类型 ,然后在设计器中创建新实体类型 ,添加对应原表中主健的属性 ,再把原映射实体类型中不需要的属性通过“剪切 / 粘贴”方法移动到新实体类型中 ,并把新实体类型中的所有属性映射到原表对应字段 ,然后在原实体类型中添加到新实体类型的 1对1(或 1 对 0.1)关联关系 ,最后 ,在添加以新实体类型为主体的到原实体类型的引用约束。通过实体类型访问数据时 ,两实体类型对象分别访问其属性对应的字段数据。
2.5. 多表派生建模
数据库建模完成后 ,对于有些表存储另一表中额外信息的情况 ,可以针对这些表建立派生的类体系结构。首先,把所有表映射到实体模型中,分别映射成一个实体类型 ,然后删除实体类型之间的关联,再为基类(Business)添加继承 ,分别设置派生类为Retails 和 e Commerces,再删除派生类中的 Business Id 属性 ,则根据表的结构完成类的体系结构建模 ,对 Retails 和 e Commerces 类型对象的操作会自动访问库表 Retails、e Commerces 及对应的 Business表中对应记录。
2.6. 表分割建模
对于常见的办公自动化系统数据库 ,由于员工类型不同 ,而薪水制度不同 ,其中 Employee Type 值为 1 则为临时工 ,薪水按小时计算 ,Wage 字段记录其每小时薪水 ,Salary 字段为无效 数 据 ,如 果 Employee Type 值 为 2 则 为 正 式 员 工 ,薪 水 按 月计算 ,Salary 字段记录其每月薪水 ,Wage 字段数据无效。为更好地实现向应用编程 ,分别建立临时工和正式员工两种类型 ,但两种类型的数据都保存在 Employees 表中。建模过程首先把 Employees 表映射到实体模型中 ,成为 Employees 类 ,然后添加新实体 Hourly Employee,指定基类为 Employees,然后通过“剪切 / 粘 贴 ” 把 Employees 中 的 Wage 属 性 移 动 到 Hourly Employee中 ,用 同 样 的 方法添加实体 Full Time Employee 类型;再在Hourly Employee 实体中 ,添加映射条件 :“Employee Type = 1”,在Full Time Employee 实体中添加映射条件 :“Employee Type = 2”,然后设置 Employees 类型为抽象类,并删除其中的 Employee Type 属性,则Hourly Employee和Full Time Employee自动处理 Employee Type 字段的值 ,并能自动根据记录创建对应类型的对象。
3. 版本信息
ADO.NET Entity Framework自.NET 3.5以来就被集成于.NET中,最新版本是Entity Framework 6.1.3。
版本 | 支持.NET | 发布情况 | 备注 |
---|---|---|---|
Entity Framework 3.5 | 2.0+ | 包含于.NET 3.5中 | 支持EDMX生成,通过扩展可支持POCO类的生成 |
Entity Framework 4.0 | 4.0+ | 包含于.NET 4.0中 | |
Entity Framework 4.X | 4.0+ | 可通过NuGet获取 | 支持Database First、Model First、Code First三种生成模式 |
Entity Framework 4.5 | 4.5+ | 集成于.NET 4.5中 | |
Entity Framework 5.X | 4.5+ | 可通过NuGet获取 | 支持枚举字段,性能有较大提升,支持.NET 4.0的版本为Entity Framework 4.4 |
总结
未完待续…