Entity Framework 简介
轉貼:鏈接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
總結
以上是生活随笔為你收集整理的Entity Framework 简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ros amcl 参数配置
- 下一篇: 33天骤降200公里:我国某卫星圆满坠入