EF 基础篇(一) 基本概念

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.52.0+包含于.NET 3.5中支持EDMX生成,通过扩展可支持POCO类的生成
Entity Framework 4.04.0+包含于.NET 4.0中
Entity Framework 4.X4.0+可通过NuGet获取支持Database First、Model First、Code First三种生成模式
Entity Framework 4.54.5+集成于.NET 4.5中
Entity Framework 5.X4.5+可通过NuGet获取支持枚举字段,性能有较大提升,支持.NET 4.0的版本为Entity Framework 4.4

总结

未完待续…


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EFEntity Framework)是一种对象关系映射(ORM)框架,可以简化数据访问和管理过程。在EF中添加一对一关系的数据,需要先创建实体类并定义好它们之间的关系,然后通过DBContext将数据保存到数据库中。下面是一个基本的示例: 假设有两个实体类:Student和Address,一个Student只有一个Address。 ```csharp public class Student { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public Address Address { get; set; } // 定义一对一关系 } public class Address { public int Id { get; set; } public string Street { get; set; } public string City { get; set; } public string State { get; set; } public string ZipCode { get; set; } public int StudentId { get; set; } // 定义外键 public Student Student { get; set; } // 定义一对一关系 } ``` 在DBContext类中,需要定义实体之间的关系: ```csharp public class SchoolContext : DbContext { public DbSet<Student> Students { get; set; } public DbSet<Address> Addresses { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Student>() .HasOne(s => s.Address) .WithOne(a => a.Student) .HasForeignKey<Address>(a => a.StudentId); } } ``` 这里使用了Fluent API来定义实体之间的关系。在HasOne方法中,指定了Student类中的Address属性与Address类中的Student属性之间的关系是一对一关系,并且指定了外键StudentId。 接下来就可以使用DBContext将数据保存到数据库中了: ```csharp using (var context = new SchoolContext()) { var student = new Student { Name = "Tom", Age = 18, Address = new Address { Street = "123 Main St", City = "New York", State = "NY", ZipCode = "10001" } }; context.Students.Add(student); context.SaveChanges(); } ``` 这里创建了一个Student对象,并且给它添加了一个Address对象,然后使用DBContext将数据保存到数据库中。保存后可以在数据库中查看到对应的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值