一、EntityFramework

  EF是传统的ORM框架,也是一个比较重量级的ORM框架。这里仍然使用EF的原因在于为了突出轻量级ORM框架的性能,所谓有对比才有更优的选择。

1.1 准备一张数据库表

  (1)For MSSQL

  1. CREATE TABLE [dbo].[Posts]
  2. (
  3. [Id] INT NOT NULL PRIMARY KEY IDENTITY,
  4. [CategoryId] INT NOT NULL,
  5. [Slug] VARCHAR(120) NOT NULL,
  6. [Title] NVARCHAR(100) NOT NULL,
  7. [Published] DATETIME NOT NULL,
  8. [Excerpt] NVARCHAR(MAX) NOT NULL,
  9. [Content] NVARCHAR(MAX) NOT NULL
  10. );

  (2)For MySQL

  1. CREATE TABLE Posts
  2. (
  3. Id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  4. CategoryId INT NOT NULL,
  5. Slug VARCHAR(120) NOT NULL,
  6. Title NVARCHAR(100) NOT NULL,
  7. Published DATETIME NOT NULL,
  8. Excerpt LONGTEXT NOT NULL,
  9. Content LONGTEXT NOT NULL
  10. );

1.2 使用Model First方式创建数据模型

  (1)通过nuget添加EF组件引用,然后创建edmx数据模型

  (2)由于EF首次使用存在效率问题,因此采用园子里推荐的EF暖机操作作为测试首次执行的代码

  1. static void WarmupEntityFramework()
  2. {
  3. // EF暖机操作
  4. using (var db = new MyAppDBContext())
  5. {
  6. var objectContext = ((IObjectContextAdapter)db).ObjectContext;
  7. var mappingCollection = (System.Data.Entity.Core.Mapping.StorageMappingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(System.Data.Entity.Core.Metadata.Edm.DataSpace.CSSpace);
  8. mappingCollection.GenerateViews(new System.Collections.Generic.List<System.Data.Entity.Core.Metadata.Edm.EdmSchemaError>());
  9. }
  10. }

  (3)写一个读取数据的方法,遍历读取Posts表记录(该表有1万行记录)

  1. static void ModelFirstReadPosts()
  2. {
  3. var dbContext = new MyAppDBContext();
  4. foreach (var item in dbContext.Posts)
  5. {
  6. Console.WriteLine("ID:{0},Title:{1}", item.Id, item.Title);
  7. }
  8. }

  (4)编写入口方法,通过Stopwatch记录测试耗时

  1. class Program
  2. {
  3. static Program()
  4. {
  5. WarmupEntityFramework();
  6. }
  7.  
  8. static void Main(string[] args)
  9. {
  10. Stopwatch watch = new Stopwatch();
  11. watch.Start();
  12. // EF:4.9s
  13. ModelFirstReadPosts();
  14. watch.Stop();
  15. Console.WriteLine("Time consumed : {0} ms", watch.ElapsedMilliseconds);
  16.  
  17. Console.ReadKey();
  18. }
  19.  
  20. #region Method01.EntityFramework暖机操作
  21. static void WarmupEntityFramework()
  22. {
  23. // EF暖机操作
  24. using (var db = new MyAppDBContext())
  25. {
  26. var objectContext = ((IObjectContextAdapter)db).ObjectContext;
  27. var mappingCollection = (System.Data.Entity.Core.Mapping.StorageMappingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(System.Data.Entity.Core.Metadata.Edm.DataSpace.CSSpace);
  28. mappingCollection.GenerateViews(new System.Collections.Generic.List<System.Data.Entity.Core.Metadata.Edm.EdmSchemaError>());
  29. }
  30. }
  31. #endregion
  32.  
  33. #region Method02.Model First方式读取数据库表记录
  34. static void ModelFirstReadPosts()
  35. {
  36. var dbContext = new MyAppDBContext();
  37. foreach (var item in dbContext.Posts)
  38. {
  39. Console.WriteLine("ID:{0},Title:{1}", item.Id, item.Title);
  40. }
  41. }
  42. #endregion
  43. }

  F5调试运行,首次查询结果如下图所示:

  五次查询之后平均耗时:4.9s

二、Dapper

2.1 关于Dapper

  Dapper是一个开源轻的量级的ORM,只有一个代码文件,完全开源,你可以放在项目里的任何位置,来实现数据到对象的ORM操作,体积小速度快。

2.2 使用Dapper

  (1)通过nuget添加Dapper组件

  (2)针对MSSQL的查询和新增操作

  1. #region Method01.读取MSSQL单张表
  2. // 2.7s
  3. static void DapperReadPosts()
  4. {
  5. using (SqlConnection connection = new SqlConnection(connStr))
  6. {
  7. var postList = connection.Query<Post>("select * from Posts");
  8. foreach (var item in postList)
  9. {
  10. Console.WriteLine("ID:{0},Title:{1}", item.Id, item.Title);
  11. }
  12. }
  13. }
  14. #endregion
  15.  
  16. #region Method02.读取MSSQL连接查询
  17. // 2.6s
  18. static void DapperReadJoin()
  19. {
  20. using (SqlConnection connection = new SqlConnection(connStr))
  21. {
  22. // 这里查询结果是动态语言类型
  23. var postList = connection.Query("select Id,Title,GETDATE() as PostDate from Posts");
  24. foreach (var item in postList)
  25. {
  26. Console.WriteLine("ID:{0},PostDate:{1}", item.Id, item.PostDate);
  27. }
  28. }
  29. }
  30. #endregion
  31.  
  32. #region Method03.读取MSSQL多个结果集
  33. // 2.8s
  34. static void DapperReadMultiResultSet()
  35. {
  36. using (SqlConnection connection = new SqlConnection(connStr))
  37. {
  38. using (var reader = connection.QueryMultiple("select * from Posts;select 1000 as Number;"))
  39. {
  40. var postList = reader.Read<Post>();
  41. foreach (var item in postList)
  42. {
  43. Console.WriteLine("ID:{0},Title:{1}", item.Id, item.Title);
  44. }
  45. }
  46. }
  47. }
  48. #endregion
  49.  
  50. #region Method04.插入MSSQL新记录
  51. // 0.37s
  52. static void InsertPostRecord()
  53. {
  54. using (SqlConnection connection = new SqlConnection(connStr))
  55. {
  56. // 多次插入单条记录
  57. int count = connection.Execute("insert into Posts values(@CategoryId, @Slug, @Title, @Published, @Excerpt, @Content);", new { CategoryId = , Slug = "BOOK", Title = "大话设计模式", Published = DateTime.Now.AddDays(), Excerpt = "ChengJie", Content = "Design Patterns" });
  58. Console.WriteLine("受影响行数:{0}", count);
  59.  
  60. count = connection.Execute("insert into Posts values(@CategoryId, @Slug, @Title, @Published, @Excerpt, @Content);", new Post() { CategoryId = , Slug = "BOOK", Title = "大话数据结构", Published = DateTime.Now.AddDays(), Excerpt = "ChengJie", Content = "Data Structure" });
  61.  
  62. Console.WriteLine("受影响行数:{0}", count);
  63.  
  64. // 一次插入多条记录
  65. IList<Post> postRecords = new List<Post>();
  66. postRecords.Add(new Post() { CategoryId = , Slug = "BOOK", Title = "构建之法-现代软件工程", Published = DateTime.Now.AddDays(), Excerpt = "ZouXin", Content = "Software Engineering" });
  67. postRecords.Add(new Post() { CategoryId = , Slug = "BOOK", Title = "编程之美", Published = DateTime.Now.AddDays(), Excerpt = "ZouXin", Content = "I Love Coding" });
  68. count = connection.Execute("insert into Posts values(@CategoryId, @Slug, @Title, @Published, @Excerpt, @Content);", postRecords);
  69.  
  70. Console.WriteLine("受影响行数:{0}", count);
  71. }
  72. }
  73. #endregion

  ① 棒棒哒的地方1:读取多表连接查询

  1. // 这里查询结果是动态语言类型
  2. var postList = connection.Query("select Id,Title,GETDATE() as PostDate from Posts");
  3. foreach (var item in postList)
  4. {
  5. Console.WriteLine("ID:{0},PostDate:{1}", item.Id, item.PostDate);
  6. }

  ② 棒棒哒的地方2:读取多个查询结果集

  1. using (var reader = connection.QueryMultiple("select * from Posts;select 1000 as Number;"))
  2. {
  3. var postList = reader.Read<Post>();
  4. foreach (var item in postList)
  5. {
  6. Console.WriteLine("ID:{0},Title:{1}", item.Id, item.Title);
  7. }
  8. }

  ③ 棒棒哒的地方3:一次插入多条数据记录

  1. // 一次插入多条记录
  2. IList<Post> postRecords = new List<Post>();
  3. postRecords.Add(new Post() { CategoryId = , Slug = "BOOK", Title = "构建之法-现代软件工程", Published = DateTime.Now.AddDays(), Excerpt = "ZouXin", Content = "Software Engineering" });
  4. postRecords.Add(new Post() { CategoryId = , Slug = "BOOK", Title = "编程之美", Published = DateTime.Now.AddDays(), Excerpt = "ZouXin", Content = "I Love Coding" });
  5. count = connection.Execute("insert into Posts values(@CategoryId, @Slug, @Title, @Published, @Excerpt, @Content);", postRecords);

  ④ 如何跨数据库读取数据记录:依赖于抽象,不依赖于具体

  1. static void GetPostsCrossMultiDB()
  2. {
  3. // 依赖于抽象,不依赖于具体
  4. using (IDbConnection connection = DbProviderFactories.GetFactory(connSetting.ProviderName).CreateConnection())
  5. {
  6. connection.ConnectionString = connSetting.ConnectionString;
  7. // 使用标准SQL语句屏蔽差异
  8. var postList = connection.Query<Post>("select * from Posts");
  9. foreach (var item in postList)
  10. {
  11. Console.WriteLine("ID:{0},Title:{1}", item.Id, item.Title);
  12. }
  13. }
  14. }

  (3)测试结果:

方法 耗时
读取MSSQL单张表 2.7s
读取MSSQL连接查询 2.6s
读取MSSQL多个结果集 2.8s
多次插入MSSQL新记录 148ms

三、PetaPoco

3.1 关于PetaPoco

  PetaPoco是一款适用于.NET应用程序的轻型对象关系映射器。与那些功能完备的ORM(如NHibernate或Entity Framework)不同的是,PetaPoco更注重易用性和性能,而非丰富的功能。使用PetaPoco只需要引入一个C#文件,可以使用强类型的 POCO(Plain Old CLR Object),并支持使用T4模板生成的类等等。

3.2 使用PetaPoco

  (1)通过nuget添加PetaPoco组件

  (2)编辑Database.tt模板文件,前提是首先将连接字符串配置正确

  (3)针对MSSQL的读取和插入操作

  1. private static void ReadAllPostData()
  2. {
  3. using (var context = new MyAppDBContext())
  4. {
  5. var postList = context.Query<Post>("select * from Posts");
  6. foreach (var item in postList)
  7. {
  8. Console.WriteLine("ID:{0},Title:{1}", item.Id, item.Title);
  9. }
  10. }
  11. }
  12.  
  13. private static void InsertNewPostData()
  14. {
  15. var post = new Post
  16. {
  17. CategoryId = ,
  18. Slug = "BOOK",
  19. Title = "Microsoft SQL Server 2008技术内幕",
  20. Content = Guid.NewGuid().ToString(),
  21. Excerpt = Guid.NewGuid().ToString(),
  22. Published = DateTime.Now
  23. };
  24.  
  25. var count = post.Insert();
  26.  
  27. Console.WriteLine("受影响行数:{0}", count);
  28. }

  (4)测试结果:

方法 耗时
读取MSSQL单张表 2.7s
插入MSSQL新纪录 30ms

SourceCode

(1)ORMDemo:http://pan.baidu.com/s/1pJAEf0n

Reference

(1)Dapper.NET:https://github.com/StackExchange/dapper-dot-net

作者:周旭龙

出处:http://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

轻量级ORM框架初探-Dapper与PetaPoco的基本使用的更多相关文章

  1. 轻量级ORM框架:Dapper中的一些复杂操作和inner join应该注意的坑

    上一篇博文中我们快速的介绍了dapper的一些基本CURD操作,也是我们manipulate db不可或缺的最小单元,这一篇我们介绍下相对复杂 一点的操作,源码分析暂时就不在这里介绍了. 一:tabl ...

  2. C# 性能优化 之 秒表 Stopwatch。 Dapper一个和petapoco差不多的轻量级ORM框架

    Sweet小马 小马同学的编程日记. C# 性能优化 之 秒表 Stopwatch. 生词解释:Diagnostics[,daɪəg'nɑstɪks] n.诊断学 using System.Diagn ...

  3. .NET轻量级ORM框架Dapper入门精通

    一.课程介绍 本次分享课程包含两个部分<.NET轻量级ORM框架Dapper修炼手册>和<.NET轻量级ORM框架Dapper葵花宝典>,阿笨将带领大家一起领略轻量级ORM框架 ...

  4. 轻量级ORM框架Dapper应用一:Dapper安装

    一.Dapper简介 Dapper是一款轻量级ORM框架,为解决网站访问流量极高而产生的性能问题而构造,主要通过执行TSQL表达式而实现数据库的CQRS. 如果你在项目中遇到性能访问问题,选择Dapp ...

  5. 分享自己写的基于Dapper的轻量级ORM框架~

    1.说明 本项目是一个使用.NET Standard 2.0开发的,基于 Dapper 的轻量级 ORM 框架,包含基本的CRUD以及根据表达式进行一些操作的方法,目前只针对单表,不包含多表连接操作. ...

  6. c# 轻量级ORM框架 实现(一)

    发布一个自己写的一个轻量级ORM框架,本框架设计期初基于三层架构.所以从命名上来看,了解三层的朋友会很好理解. 设计该框架的目的:不想重复的写增删改查,把精力放到功能实现上. 发布改框架的原因:希望给 ...

  7. 轻量级ORM框架 QX_Frame.Bantina(二、框架使用方式介绍)

    轻量级ORM框架QX_Frame.Bantina系列讲解(开源) 一.框架简介 http://www.cnblogs.com/qixiaoyizhan/p/7417467.html 二.框架使用方式介 ...

  8. 轻量级ORM框架 QX_Frame.Bantina(一、框架简介)

    轻量级ORM框架QX_Frame.Bantina系列讲解(开源) 一.框架简介 http://www.cnblogs.com/qixiaoyizhan/p/7417467.html 二.框架使用方式介 ...

  9. Dapper一个和petapoco差不多的轻量级ORM框架

    我们都知道ORM全称叫做Object Relationship Mapper,也就是可以用object来map我们的db,而且市面上的orm框架有很多,其中有一个框架 叫做dapper,而且被称为th ...

随机推荐

  1. 卸载oracle 11g数据库软件

    卸载oracle,从11g开始使用deinstall卸载数据库软件可以干净卸掉oracle $ cd $ORACLE_HOME/deinstall $ ls -l total 152 -rwxr-xr ...

  2. 大数据项目实践:基于hadoop+spark+mongodb+mysql+c#开发医院临床知识库系统

    一.前言 从20世纪90年代数字化医院概念提出到至今的20多年时间,数字化医院(Digital Hospital)在国内各大医院飞速的普及推广发展,并取得骄人成绩.不但有数字化医院管理信息系统(HIS ...

  3. DataGridView回车焦点横向移动

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)        {            if (keyData ...

  4. js数组操作大全

    原文(http://www.cnblogs.com/webhotel/archive/2010/12/21/1912732.html) 用 js有很久了,但都没有深究过js的数组形式.偶尔用用也就是简 ...

  5. mybatis map常用数据类型

    JDBC Type Java Type CHAR String VARCHAR String LONGVARCHAR String NUMERIC java.math.BigDecimal DECIM ...

  6. nodejs复习05

    stream 可读流 fs.pause()方法会使处于流动模式的流停止触发data事件,切换到非流动模式并让后续数据流在内部缓冲区 var fs = require('fs') var rs = fs ...

  7. ubuntu 用apt-get 安装apache 和php 之后php不能解析的问题

    sudo apt-get install apache2 sudo apt-get install php7.0 sudo apt-get install libapache2-mod-php //关 ...

  8. my97DatePicker日期控件——日期输入框联动,使用focus使第二个输入框没展示出日期控件

    描述问题场景: 1.jquery使用的版本是jquery-1.7.2.min.js 2.代码不是写在页面上的,是通过事件后追加的 <!DOCTYPE html> <html> ...

  9. bzoj1968真·想sha法bi题

    本来想打表找规律的来着,,, 线性筛吗?一边筛一边累加答案?那不就不线性了吗...1e6悬啊 而且不是质因数个数而是因数个数,统计起来应该还要用数学方法 ...好尴尬 等一下,不要求质数的话我筛个p ...

  10. ORA-12560: TNS: 协议适配器错误

    解决方案: 在开始菜单搜索 services.msc,进入本地服务 将 OracleOraDb11g_home1ClrAgent,OracleOraDb11g_home1TNSListener,Ora ...