EntityFramework6简介.docx_第1页
EntityFramework6简介.docx_第2页
EntityFramework6简介.docx_第3页
EntityFramework6简介.docx_第4页
EntityFramework6简介.docx_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

EntityFramework6.1调研报告一、简介1.1. 什么是EF实体框架(EF),是一种域对象与数据存储对象映射关系的处理框架,使.NET 开发人员能够专注于域对象的设计与开发,而不需要关心实际数据存储。它简化了开发人员编写数据访问代码的工作。可通过NuGet工具获取最新发布的组件,VS无法连接网络的朋友也可以在codeplex网站下载,上面也有一些相关文档可以参考 1.2. EF框架图1.3. EF优缺点这是一整完整的“域模型-数据模型”映射方案,支持各种概念关系模型(后面只列举部分示例),在此基础上开发者无需过多关心数据持久,可更多的关注于领域建模;同时VS对应工具的集成度也非常高,实体生成、数据库生成、关系映射、Edmx实体关系集的生成都能完美的实现自动化;基于linq与表达式的强类型化操作,增删改查操作变得更加简单,极大提高了开发效率、代码重用性;由微软团队开发,拥有完整的技术团队及社区支持,拥有官方技术资料及视频教程,拥有与VS高度集成的辅助开发工具,并且版本处于持续更新完善中;EF6.0相对于EF5.0版本Sql语句得到了更好的优化;同时也与其MVC一样,面向所有使用者开源,可在实际的项目中自定义需求;市面上有多种数据源引擎支持,适用于SqlServer、MySql、Orcale等主流数据库;相比ADO.NET,引入了中间层的处理,脚本解析、数据库连接管理、性能调优等方方面面,还有待在实际开发过程中逐一完善;可能还会存在一些小的缺陷,比如MyAppContext继承DbContext后,通过其基类对象DbContext调用基类数据集查询方法,会报异常。下面我们就主要针对Code First来做一个使用说明2、 环境配置Entity Framework包含EF Tools for Visual Studio 和 EF Runtime。1.1. EF Tools Visual Studio 2013已包含EF6的工具,如果您使用的 Visual Studio 2012,可以从Microsoft下载中心获取。/en-us/download/details.aspx?id=40762如果您选择自定义安装Visual Studio,需要确保选中 Microsoft Web 开发工具或 Microsoft SQL Server数据工具,否则将不安装 EF工具。1.2. EF Runtime可以通过 NuGet 程序包管理器来获取Entity Framework最新可用版本,在VS无法连接外网的情况下,也访问CodePlex网站下载发布版本或源码/packages/EntityFramework//1.2.1. 通过NuGet安装在项目中右键单击引用,选择 NuGet 程序包管理,下载 EntityFramework1.2.2. 通过程序包管理控制台安装PM Install-Package EntityFramework1.2.3. 安装最新版NuGet方式控制台方式PM Install-Package EntityFramework -Pre1.3. EF扩展插件entityframework.extended是一套支持批量更新、批量删除等扩展功能的组件,这个插件真的很实用,我们可以使用以下语法来简化我们的工作Deletingcontext.Users.Delete(u = u.FirstName = firstname); Updatevar users = context.Users.Where(u = u.FirstName = firstname); context.Users.Update(users, u = new User FirstName = newfirstname); 1.3.1. 通过程序包管理控制台安装PM Install-Package EntityFramework.Extended1.3.2. 下载地址/loresoft/EntityFramework.Extended1.3.3. 注意事项使用方法,引用插件并引用命名空间 using EntityFramework.Extensions;测试中发现,这个组件只实现了SqlServer的批量删除与更新,MySql或其他数据库的批量方法需要自己实现,实现方式首先实现IBatchRunner、IMappingProvider接口然后在上下文加载的时候调用以下方法即可Locator.Current.Register() = new MySqlBatchRunner();Locator.Current.Register() = new MySqlMetadataMappingProvider();1.4. Code First逆向引擎如果朋友们习惯先创建数据,再生成实体代码的话,可以考虑使用Entity Framework Power Tools 工具(目前似乎只支持VS2010、VS2013,不支持VS2012),从已有数据中创建、更新实体及映射关系/72a60b14-1581-4b9b-89f2-846072eff19d/2、 使用说明我们这里讨论Code First方式,测试过程我们使用了Entity Framework 6.0版本组件使用Code First方式时,系统会有一套默认的约定,比如说,哪个属性会是实体的主键、实体映射到哪张表、表字段默认的精度和取值范围。下面我们介绍一下约束的自定义配置。1.1. 定义模型using System;using System.Collections.Generic;using System.Data.Entity;using System.Linq;public class ProductContext : DbContext static ProductContext() Database.SetInitializer(new DropCreateDatabaseIfModelChanges(); public DbSet Products get; set; public class Product public int Key get; set; public string Name get; set; public decimal? Price get; set; public DateTime? ReleaseDate get; set; public ProductCategory Category get; set; public class ProductCategory public int Key get; set; public string Name get; set; public List Products get; set; 1.2. 定义约束约束在模型初始化的时候会被启用,我们重写OnModelCreating方法,在它的上下文中给实体配置主键public class ProductContext : DbContext static ProductContext() Database.SetInitializer(new DropCreateDatabaseIfModelChanges(); public DbSet Products get; set; protected override void OnModelCreating(DbModelBuilder modelBuilder) modelBuilder.Properties() .Where(p = p.Name = Key) .Configure(p = p.IsKey(); 我们定义所有实体中,名字叫“Key”的属性都被定义为该实体的主键,接下来,我们在这个约束上添加更多的过滤条件modelBuilder.Properties().Where(p = p.Name = Key).Configure(p = p.IsKey();我们定义所有实体中,名字叫“Key”,并且是Int类型的属性都被定义为该实体的主键,并且我们定义联合主键modelBuilder.Properties() .Where(x = x.Name = Key) .Configure(x = x.IsKey().HasColumnOrder(1); modelBuilder.Properties() .Where(x = x.Name = Name) .Configure(x = x.IsKey().HasColumnOrder(2);我们定义所有实体中,DateTime类型映射到数据库中的datetime类型public class DateTime2Convention : Convention public DateTime2Convention() this.Properties() .Configure(c = c.HasColumnType(datetime2); protected override void OnModelCreating(DbModelBuilder modelBuilder) modelBuilder.Properties() .Where(p = p.Name.EndsWith(Key) .Configure(p = p.IsKey(); modelBuilder.Conventions.Add(new DateTime2Convention();1.3. 继承关系public class Employee public int Id get; set; public string Name get; set; public class Manager : Employee public string SectionManaged get; set; 默认情况下,两个类会映射到同一张表,有一个类型字段用来做区分,我们也可以针对每个类型定义一张表,添加如下代码modelBuilder.Types() .Configure(c = c.ToTable(c.ClrType.Name);表结构如下1.4. 增删改查TestMethodpublic void InsertTest()using (var ctx = new HolidayPlanRepository()var entity = ctx.Set().Add(new HolidayPlan()CreateDate = DateTime.Now); ctx.SaveChanges(); entity = ctx.Set().SingleOrDefault(c = c.HolidayPlanId = entity.HolidayPlanId); Assert.IsNotNull(entity);TestMethodpublic void DeleteTest()var entity = Add();using (var ctx = new HolidayPlanRepository() ctx.Entry(entity).State = EntityState.Deleted; var result = ctx.SaveChanges(); Assert.IsTrue(result 0); entity = ctx.Set().SingleOrDefault(c = c.HolidayPlanId = entity.HolidayPlanId); Assert.IsNull(entity);TestMethodpublic void UpdateTest() var entity = Add(); using (var ctx = new HolidayPlanRepository()Assert.AreEqual(DateTime.Now.DayOfYear, entity.ModifyDate.Value.DayOfYear);entity.ModifyDate = DateTime.Now.AddDays(1);ctx.Set().Attach(entity);ctx.Entry(entity).State = EntityState.Modified;ctx.Update(entity);ctx.SaveChanges();var update = ctx.Set().SingleOrDefault(c = c.HolidayPlanId = entity.HolidayPlanId); Assert.AreEqual(entity.ModifyDate.Value.DayOfYear, update.ModifyDate.Value.DayOfYear); TestMethodpublic void FindTest()var entity = Add();using (var ctx = new HolidayPlanRepository()var model = ctx.Set().SingleOrDefault(c = c.HolidayPlanId = entity.HolidayPlanId); Assert.AreEqual(entity.HolidayPlanId, model.HolidayPlanId);1.5. 构建数据库在应用程序上下文创建过程中,调用数据库创建策略方法,即可自动检查并根据模型、约束关系构建数据库Database.SetInitializer(new CreateDatabaseIfNotExists();对于习惯先创建数据库,并且对约束配置不熟悉的朋友,也可以先

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论