转贴:链接https://www.cnblogs.com/davidzhou/p/5348637.html
侵删,谢谢
第一篇:Entity Framework 简介
先从ORM说起吧,很多年前,由于.NET的开源组件不像现在这样发达,更别说一个开源的ORM框架,出于项目需要,以及当时OOP兴起(总不至于,在项目里面全是SQL语句),就自己开始写ORM框架。要开发ORM框架首先要了解ORM概念。
ORM 对象关系映射,O(Object) 对象,在项目中就是实体,更加精确的来说就是数据Model,也可以说持久化类。R(Relation) 关系数据,M (Mapping)映射,将对象映射到关系数据,将关系数据映射到对象的过程。
更加直观理解就是,ORM 就是以OOP思想,产生增删改查SQL语句
了解ORM概念之后,你会发现,其实ORM框架,主要难点在M映射部分
O 创建简单的实体对象就可以
R 关系数据库中数据表
M 难点要如何把实体对象与关系数据库具体数据表关联起来,然后产生相应数据库操作SQL?
当时,幸好.NET 有两样技术比较流行
1. 特性
2. 反射
当时主要利用 特性 来标识 实体 映射 具体数据库 TableName ,属性 对应的 具体表的ColumnName,还有主外建,是否自增量,默认值 等等,都用特性来标识。
将实体,属性上的特性反射后,然后根据增删改查操作方法,就可以产生对应的SQL语句。
至此一个简单的ORM框架,就有了。
这几年,.NET 技术有了飞速发展,有很多写得不错的开源组件如雨后春笋般涌现,也包含ORM框架
Hibernate , Drapper,EntityFramework 等等
EntityFramework 版本历史简介
EF版本 | .net framework和IDE版本 | 主要功能 |
EF(or EF3.5) | Visual Studio 2008 SP1 (.NET 3.5 SP1) | 基本的O/R映射支持,使用DB First开发模式 |
EF 4 | Visual Studio 2010 (.NET 4.0) | 支持POCO实体 延迟加载 提高单元测试能力 自定义的代码生成机制 支持Model First开发模式 |
EF 4.1 | NuGet | 提供简化的DbContext接口 支持Code First开发模式 |
EF 4.1.1 | 过渡版本 | 支持Power Tools工具 |
EF 4.2 | 过渡版本 | 解决bug并优化 |
EF 4.3 | Visual Studio 2010 (.NET 4.0) | 基于Code First开发模式的代码迁移策略 Migrations |
EF 4.3.1 | Visual Studio 2012 (.NET 4.5) | 提供对 LocalDb 数据库的支持 |
EF 5 | Visual Studio 2012 (.NET 4.5) | 提供对枚举类型的支持 Table-Valued functions表值函数 空间数据类型(spatial types) 整体性能优化提升 实体模型设计器、多图模型 批量导入存储过程 |
EF 6 | Visual Studio 2013 (.NET 4.5) | Power Tools加强 EF脱离Visual Studio和.NET通过NuGet单独发布 可配置不稳定连接的重试次数等 支持.NET 4.5中基于Task的异步编程模式 Async Query and Save 优化的配置选项 Code-Based Configuration 支持依赖注入和服务定位 Dependency Resolution 低级的EF拦截器及SQL日志 Interception/SQL Loggin 使用Mock单元测试 using a mocking framework or writing your own test doubles 使用已有的DbConnection创建DbContext 提升事务支持 Improved Transaction Support 优化LINQ to Entities查询性能 优化(View Generation)性能 支持自定义实现Entity的Equals和GetHashCode方法 DBSet.AddRange/RemoveRange DbChangeTracker.HasChanges 扩展的SqlFunctions,SqlCeFunctions |
EF 6.0.1 | Visual Studio 2013 (.NET 4.5) | fix some performance issues during warm-up for EF models. |
EF 6.0.2 | Visual Studio 2013 (.NET 4.5) | The tooling for Visual Studio 2012 and Visual Studio 2013 is available on the Microsoft Download Center. You only need to install the tooling if you want to use Model First or Database First |
EF 6.1 | Visual Studio 2013 (.NET 4.5) | Tooling consolidation provides a consistent way to create a new EF model. This feature extends the ADO.NET Entity Data Model wizard to support creating Code First models, including reverse engineering from an existing database. These features were previously available in Beta quality in the EF Power Tools. Handling of transaction commit failures provides theCommitFailureHandler which makes use of the newly introduced ability to intercept transaction operations. The CommitFailureHandler allows automatic recovery from connection failures whilst committing a transaction IndexAttributeallows indexes to be specified by placing an [Index] attribute on a property (or properties) in your Code First model. Code First will then create a corresponding index in the database The public mapping API provides access to the information EF has on how properties and types are mapped to columns and tables in the database. In past releases this API was internal |
EntityFramework 刚刚出来时,反响就比较不错。那时我有接触一些,不多,也不知道当时为什么这么好的东西,没有深耕一下。
2014 年,去了一家创业公司,做技术主管,做架构开发,当时定的 ASP.NET MVC 5&Entity Framework 6做开发框架。
再次了解到EntityFramework的强大。
Entity Framework 有三种实作方式
1. DataBase First 数据库先行
2. Model First 模型先行
3. Code First 代码先行
前两种就是拖控件,按照指引一步步,就可以完成Entity Framework 实现。
Code First 就是代码纯手工打造。
Entity Framework 介绍暂时介绍完成,我们这个系列实作Entity Framework 方式是Code First,因为Code First 才能更加深入了解Entity Framework 工作原理。
我们这个系列采用是 Entity Framework 6.1 版本,最后这几个版本区别不大。
CodePlex : http://entityframework.codeplex.com/
GitHub : https://github.com/aspnet/EntityFramework/
开发指南:https://docs.efproject.net/en/latest/
敬请期待
第二篇:Entity Framework CodeFirst & Model 映射
前一篇 第一篇:Entity Framework 简介 我有讲到,ORM 最关键的 Mapping,也提到了最早实现Mapping的技术,就是 特性 + 反射,那Entity Framework 实现Mapping 又是怎样的呢? EntityFramework 实现Mapping 有两种方式。
1. 数据注解(DataAnnotations)
2. Fluent API
一. 数据注解,这种方式,就是在实体和属性加上一些EntityFramework 定义好的一些特性,然后EntityFramework,在具体操作数据库时进行反射。跟我们上篇提到 特性+反射 一样的方案。因此今天不会在这篇讲 DataAnnotations 。会贴一点实例代码。
比较要注意的是,实现 DataAnnotations ,要引用 System.ComponentModel.DataAnnotations 命名空间。
实例代码如下,特殊说明一下,EntityFramework 支持 .Net 可为空表达法,如 int?,DateTime? 。下面代码 最后修改时间 LastModifiedDateTime 就是这样。
using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema;namespace EntityFrameworkSample.Models {[Table("Sample_Order")] //标示为 表名//[Table("Sample_Order", Schema = "dbo")] //标示为 表名 ,表的拥有者public class OrderModel{[Key]//标示为 主键[DatabaseGenerated(DatabaseGeneratedOption.Identity)] // 标示为 自动增量public Guid OrderGuid { get; set; }[Required] //标示为 必填[MaxLength(30)] //标示为 字符串长度最大30public string OrderNo { get; set; }[Required] //标示为 必填[MaxLength(20)] //标示为 字符串长度最大30public string OrderCreator { get; set; }[Required][DatabaseGenerated(DatabaseGeneratedOption.Identity)] // 标示为 自动增量 数据库有默认值 getdate()public DateTime OrderDateTime { get; set; }[Required]public string OrderStatus { get; set; }[MaxLength(1000)]public string Description { get; set; }[Required][MaxLength(20)] //标示为 字符串长度最大30public string Creator { get; set; }[Required]public DateTime CreateDateTime { get; set; }public string LastModifier { get; set; }public DateTime? LastModifiedDateTime { get; set; }} }
看吧,数据注解(DataAnnotations ),就是旧技术换一个叫法而已。没有什么大不了。其他的就靠大家去摸索了。
二 . Fluent API 查了一下百度翻译,“流畅的API” ,我不知道这个翻译贴不贴不切,我就以我使用Fluent API 经验说说,Fluent API 比 数据注解好的地方。
1. 大家再看一眼上面代码,是不是感觉有点不纯净了,本来一个干干净净的类,搞得乱乱的。感觉有点恶心。
2. 这一点可能要后面我贴出代码,分享源代码才理解,不过使用过EntityFramework Fluent API 的应该能够理解到,配置和类分离,职责更加单一。
3. 配置和类分离,扩展性,灵活性就会更好,大家多知道,EntityFramework 不仅支持Sql Server,支持Oracle,MySql,Sqlite 等这些流行数据库,每种产品配置也许都有细微差别,如果以 DataAnnotations 方式实作,那我岂不是要重新新增模型,一样的表设计,为什么要加呢? 只有配置不同才要加啊!
4. 做技术架构,这种方式封装也比较好,怎么好大家如果是做架构的话,两种方式都用一下,感受一下。
废话不多说了,直接贴出实现 Fluent API 的流程,以及代码。
1. 创建数据库“EntityFrameworkSample”
2. 在数据库“EntityFrameworkSample”中,加表“Sample_Order”,然后向表中新增所需要的字段。
3. 新建解决方案 “EntityFrameworkSample”
4. 在解决方案中 新增“EntityFrameworkSample.DbContext” (配置最终使用地方),“EntityFrameworkSample.Models”(纯净数据Model),“EntityFrameworkSample.Mappings” (映射配置)三个类库项目
5. 在“EntityFrameworkSample.DbContext” ,“EntityFrameworkSample.Mappings” 项目中,通过NuGet 安装EntityFramework 最新版本。
6. 在 “EntityFrameworkSample.DbContext” 项目中,新增“EntityFrameworkSampleDbContext” DbContext 类,
在“EntityFrameworkSample.Models” 项目中,新增“OrderModel” Model类,
在“EntityFrameworkSample.Mappings”项目中,新增“OrderMap” 映射配置类。
三个项目 代码图 和引用关系如下图
三个类的代码分别如下
EntityFrameworkSampleDbContextusing System.Data.Entity;using EntityFrameworkSample.Mappings;
using EntityFrameworkSample.Models;namespace EntityFrameworkSample.DbContext {public class EntityFrameworkSampleDbContext:System.Data.Entity.DbContext{public EntityFrameworkSampleDbContext(): base("EntityFrameworkSampleConnection"){}public DbSet<OrderModel> orders { get; set; }protected override void OnModelCreating(DbModelBuilder modelBuilder){modelBuilder.Configurations.Add(new OrderMap());base.OnModelCreating(modelBuilder);}} }
OrderModel
using System;namespace EntityFrameworkSample.Models {public class OrderModel{ public Guid OrderGuid { get; set; }public string OrderNo { get; set; }public string OrderCreator { get; set; }public DateTime OrderDateTime { get; set; }public string OrderStatus { get; set; }public string Description { get; set; }public string Creator { get; set; }public DateTime CreateDateTime { get; set; }public string LastModifier { get; set; }public DateTime LastModifiedDateTime { get; set; }} }
OrderMap
using System.ComponentModel.DataAnnotations.Schema; using System.Data.Entity.ModelConfiguration; using EntityFrameworkSample.Models;namespace EntityFrameworkSample.Mappings {public class OrderMap : EntityTypeConfiguration<OrderModel>{public OrderMap(){this.HasKey(m => m.OrderGuid);this.Property(m => m.OrderGuid).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);this.Property(m => m.OrderNo).IsRequired().HasMaxLength(30);this.Property(m => m.OrderCreator).IsRequired().HasMaxLength(20);this.Property(m => m.OrderStatus).IsRequired().HasMaxLength(30);this.Property(m => m.Description).HasMaxLength(1000);this.Property(m => m.Creator).IsRequired().HasMaxLength(20);this.Property(m => m.LastModifier).HasMaxLength(15).HasMaxLength(20);this.ToTable("Sample_Order");this.Property(m => m.OrderGuid).HasColumnName("OrderGuid");this.Property(m => m.OrderNo).HasColumnName("OrderNo");this.Property(m => m.OrderCreator).HasColumnName("OrderCreator");this.Property(m => m.OrderDateTime).HasColumnName("OrderDateTime");this.Property(m => m.OrderStatus).HasColumnName("OrderStatus");this.Property(m => m.Description).HasColumnName("Description");this.Property(m => m.Creator).HasColumnName("Creator");this.Property(m => m.CreateDateTime).HasColumnName("CreateDateTime");this.Property(m => m.LastModifier).HasColumnName("LastModifier");this.Property(m => m.LastModifiedDateTime).HasColumnName("LastModifiedDateTime");}} }
至此解决方案此阶段所有代码就完成了。
大概讲一下一些注意点。
1. EntityFrameworkSampleDbContext 必须要继承 DbContext,并重写OnModelCreating方法,来完成映射.
2. OrderMap 必须继承EntityTypeConfiguration<>泛型类,泛型类型 OrderModel,大概告诉Map映射的是OrderModel。
好了,这篇内容结束了,不足的地方,我没有列出Fluent API 所有api,主要是表与表的关系是如何映射的,这些希望读者,能够自己去摸索,篇幅有限,
还有就是DbContext 我也没有在这篇详细介绍,会在真正讲到DbContext那篇在详细跟大家介绍。
随笔 - 27 文章 - 1 评论 - 184
第三篇:Entity Framework CodeFirst & Model 映射 续篇 EntityFramework Power Tools 工具使用
上一篇 第二篇:Entity Framework CodeFirst & Model 映射 主要介绍以Fluent API来实作EntityFramework CodeFirst,得到了大家一些支持,其中就有一位同学就提出。熟悉了EntityFramework CodeFirst 原理,就可以用微软的工具来生产代码。是的,今天就来讲一下,由微软EntityFramework小组开发的为EntityFramework CodeFirst Visual Studio小插件 “Entity Framework Power Tools”.
Entity Framework Power Tools 现在Bate4 版,估计也不会更新,因为现在紧锣密鼓的 开发Entity Framework 7。不过没有关系,Bate4 已经很稳定了,很能够解决Fluent API 繁琐的Model,Mapping 创建的工作。是一款很不错生产力工具,下面就听我慢慢的讲怎么用咯。
一. Entity Framework Power Tools Bate4 安装
1. 打开Visual Studio 2013 ,选择 工具 菜单,再选择 扩展和更新。
2. 选择左边菜单的联机——在右上的搜索栏中输入 power tool ,在搜索结果中找到,Entity Framework Power Tools Bate4 下载安装,然后重启。
如果家里网速不行,搜索 转了半天 也不出来的话,我这里也提供独立安装包 下载 :http://files.cnblogs.com/files/davidzhou/EFPowerTools.zip 解压安装即可。
二. Entity Framework Power Tools 的使用
1. 重新打开 Visual Studio 2013 ,新建 “EntityFrameworkPowerToolsSample” 解决方案,然后添加“EntityFrameworkPowerTools.Models” 类库项目。
2. 右击 “EntityFrameworkPowerTools.Models” 类库项目,会多出来一个“Entity Framework” 菜单
选择 “Entity Framework” 菜单下的“Reverse Engineer Code First” 选项,会弹出 数据库 连接属性界面,配置你要连接的数据库服务器,数据库。
我这里配置的是,我本机的 “EntityFrameworkSample” 数据库。
点击 “确定” 不出意外就会产生Entity Framework CodeFirst 相关的代码。如果没有安装Entity Framework,在生成之前会自动给安装。
3. 生成代码如下
Sample_Order (数据模型)
using System; using System.Collections.Generic;namespace EntityFrameworkPowerTools.Models.Models {public partial class Sample_Order{public System.Guid OrderGuid { get; set; }public string OrderNo { get; set; }public string OrderCreator { get; set; }public System.DateTime OrderDateTime { get; set; }public string OrderStatus { get; set; }public string Description { get; set; }public string Creator { get; set; }public System.DateTime CreateDateTime { get; set; }public string LastModifier { get; set; }public Nullable<System.DateTime> LastModifiedDateTime { get; set; }} }
Sample_OrderMap (映射配置)
using System.Data.Entity.ModelConfiguration;namespace EntityFrameworkPowerTools.Models.Models.Mapping {public class Sample_OrderMap : EntityTypeConfiguration<Sample_Order>{public Sample_OrderMap(){// Primary Keythis.HasKey(t => t.OrderGuid);// Propertiesthis.Property(t => t.OrderNo).IsRequired().HasMaxLength(30);this.Property(t => t.OrderCreator).IsRequired().HasMaxLength(20);this.Property(t => t.OrderStatus).IsRequired().HasMaxLength(30);this.Property(t => t.Description).HasMaxLength(1000);this.Property(t => t.Creator).IsRequired().HasMaxLength(20);this.Property(t => t.LastModifier).HasMaxLength(20);// Table & Column Mappingsthis.ToTable("Sample_Order");this.Property(t => t.OrderGuid).HasColumnName("OrderGuid");this.Property(t => t.OrderNo).HasColumnName("OrderNo");this.Property(t => t.OrderCreator).HasColumnName("OrderCreator");this.Property(t => t.OrderDateTime).HasColumnName("OrderDateTime");this.Property(t => t.OrderStatus).HasColumnName("OrderStatus");this.Property(t => t.Description).HasColumnName("Description");this.Property(t => t.Creator).HasColumnName("Creator");this.Property(t => t.CreateDateTime).HasColumnName("CreateDateTime");this.Property(t => t.LastModifier).HasColumnName("LastModifier");this.Property(t => t.LastModifiedDateTime).HasColumnName("LastModifiedDateTime");}} }
EntityFrameworkSampleContext (DbContext)
using System.Data.Entity; using System.Data.Entity.Infrastructure; using EntityFrameworkPowerTools.Models.Models.Mapping;namespace EntityFrameworkPowerTools.Models.Models {public partial class EntityFrameworkSampleContext : DbContext{static EntityFrameworkSampleContext(){Database.SetInitializer<EntityFrameworkSampleContext>(null);}public EntityFrameworkSampleContext(): base("Name=EntityFrameworkSampleContext"){}public DbSet<Sample_Order> Sample_Order { get; set; }protected override void OnModelCreating(DbModelBuilder modelBuilder){modelBuilder.Configurations.Add(new Sample_OrderMap());}} }
怎么样是不是代码,跟上一篇,代码差不多啊。只是文件的名称不同而已,如果想调整项目结构,像上一篇一样,你可以把 EntityFramework Power Tools 生产代码拷贝过去,稍作调整就可以了。
当然EntityFramework Power Tools 还可以自定义模板,跟自己写T4模板一样,来实现自己想要规则。我这里就不再做详细讲解了,大家自己摸索一下。
然后本篇的源代码 : http://pan.baidu.com/s/1c2K4R8s