EF是传统的ORM框架,也是一个比较重量级的ORM框架。这里仍然使用EF的原因在于为了突出轻量级ORM框架的性能,所谓有对比才有更优的选择。
1.1 准备一张数据库表
(1)For MSSQL
CREATE TABLE [dbo].[Posts] ( [Id] INT NOT NULL PRIMARY KEY IDENTITY, [CategoryId] INT NOT NULL, [Slug] VARCHAR(120) NOT NULL, [Title] NVARCHAR(100) NOT NULL, [Published] DATETIME NOT NULL, [Excerpt] NVARCHAR(MAX) NOT NULL, [Content] NVARCHAR(MAX) NOT NULL );
(2)For MySQL
CREATE TABLE Posts ( Id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, CategoryId INT NOT NULL, Slug VARCHAR(120) NOT NULL, Title NVARCHAR(100) NOT NULL, Published DATETIME NOT NULL, Excerpt LONGTEXT NOT NULL, Content LONGTEXT NOT NULL );
1.2 使用Model First方式创建数据模型
(1)通过nuget添加EF组件引用,然后创建edmx数据模型
(2)由于EF首次使用存在效率问题,因此采用园子里推荐的EF暖机操作作为测试首次执行的代码
static void WarmupEntityFramework() { // EF暖机操作 using (var db = new MyAppDBContext()) { var objectContext = ((IObjectContextAdapter)db).ObjectContext; var mappingCollection = (System.Data.Entity.Core.Mapping.StorageMappingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(System.Data.Entity.Core.Metadata.Edm.DataSpace.CSSpace); mappingCollection.GenerateViews(new System.Collections.Generic.List<System.Data.Entity.Core.Metadata.Edm.EdmSchemaError>()); } }
(3)写一个读取数据的方法,遍历读取Posts表记录(该表有1万行记录)
static void ModelFirstReadPosts() { var dbContext = new MyAppDBContext(); foreach (var item in dbContext.Posts) { Console.WriteLine("ID:{0},Title:{1}", item.Id, item.Title); } }
(4)编写入口方法,通过Stopwatch记录测试耗时
class Program { static Program() { WarmupEntityFramework(); } static void Main(string[] args) { Stopwatch watch = new Stopwatch(); watch.Start(); // EF:4.9s ModelFirstReadPosts(); watch.Stop(); Console.WriteLine("Time consumed : {0} ms", watch.ElapsedMilliseconds); Console.ReadKey(); } #region Method01.EntityFramework暖机操作 static void WarmupEntityFramework() { // EF暖机操作 using (var db = new MyAppDBContext()) { var objectContext = ((IObjectContextAdapter)db).ObjectContext; var mappingCollection = (System.Data.Entity.Core.Mapping.StorageMappingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(System.Data.Entity.Core.Metadata.Edm.DataSpace.CSSpace); mappingCollection.GenerateViews(new System.Collections.Generic.List<System.Data.Entity.Core.Metadata.Edm.EdmSchemaError>()); } } #endregion #region Method02.Model First方式读取数据库表记录 static void ModelFirstReadPosts() { var dbContext = new MyAppDBContext(); foreach (var item in dbContext.Posts) { Console.WriteLine("ID:{0},Title:{1}", item.Id, item.Title); } } #endregion }