轻量级ORM框架初探-Dapper与PetaPoco的基本使用
一、EntityFramework
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
- }
F5调试运行,首次查询结果如下图所示:
五次查询之后平均耗时:4.9s
二、Dapper
2.1 关于Dapper
Dapper是一个开源轻的量级的ORM,只有一个代码文件,完全开源,你可以放在项目里的任何位置,来实现数据到对象的ORM操作,体积小速度快。
2.2 使用Dapper
(1)通过nuget添加Dapper组件
(2)针对MSSQL的查询和新增操作
- #region Method01.读取MSSQL单张表
- // 2.7s
- static void DapperReadPosts()
- {
- using (SqlConnection connection = new SqlConnection(connStr))
- {
- var postList = connection.Query<Post>("select * from Posts");
- foreach (var item in postList)
- {
- Console.WriteLine("ID:{0},Title:{1}", item.Id, item.Title);
- }
- }
- }
- #endregion
- #region Method02.读取MSSQL连接查询
- // 2.6s
- static void DapperReadJoin()
- {
- using (SqlConnection connection = new SqlConnection(connStr))
- {
- // 这里查询结果是动态语言类型
- var postList = connection.Query("select Id,Title,GETDATE() as PostDate from Posts");
- foreach (var item in postList)
- {
- Console.WriteLine("ID:{0},PostDate:{1}", item.Id, item.PostDate);
- }
- }
- }
- #endregion
- #region Method03.读取MSSQL多个结果集
- // 2.8s
- static void DapperReadMultiResultSet()
- {
- using (SqlConnection connection = new SqlConnection(connStr))
- {
- using (var reader = connection.QueryMultiple("select * from Posts;select 1000 as Number;"))
- {
- var postList = reader.Read<Post>();
- foreach (var item in postList)
- {
- Console.WriteLine("ID:{0},Title:{1}", item.Id, item.Title);
- }
- }
- }
- }
- #endregion
- #region Method04.插入MSSQL新记录
- // 0.37s
- static void InsertPostRecord()
- {
- using (SqlConnection connection = new SqlConnection(connStr))
- {
- // 多次插入单条记录
- 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" });
- Console.WriteLine("受影响行数:{0}", count);
- 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" });
- Console.WriteLine("受影响行数:{0}", count);
- // 一次插入多条记录
- IList<Post> postRecords = new List<Post>();
- postRecords.Add(new Post() { CategoryId = , Slug = "BOOK", Title = "构建之法-现代软件工程", Published = DateTime.Now.AddDays(), Excerpt = "ZouXin", Content = "Software Engineering" });
- postRecords.Add(new Post() { CategoryId = , Slug = "BOOK", Title = "编程之美", Published = DateTime.Now.AddDays(), Excerpt = "ZouXin", Content = "I Love Coding" });
- count = connection.Execute("insert into Posts values(@CategoryId, @Slug, @Title, @Published, @Excerpt, @Content);", postRecords);
- Console.WriteLine("受影响行数:{0}", count);
- }
- }
- #endregion
① 棒棒哒的地方1:读取多表连接查询
- // 这里查询结果是动态语言类型
- var postList = connection.Query("select Id,Title,GETDATE() as PostDate from Posts");
- foreach (var item in postList)
- {
- Console.WriteLine("ID:{0},PostDate:{1}", item.Id, item.PostDate);
- }
② 棒棒哒的地方2:读取多个查询结果集
- using (var reader = connection.QueryMultiple("select * from Posts;select 1000 as Number;"))
- {
- var postList = reader.Read<Post>();
- foreach (var item in postList)
- {
- Console.WriteLine("ID:{0},Title:{1}", item.Id, item.Title);
- }
- }
③ 棒棒哒的地方3:一次插入多条数据记录
- // 一次插入多条记录
- IList<Post> postRecords = new List<Post>();
- postRecords.Add(new Post() { CategoryId = , Slug = "BOOK", Title = "构建之法-现代软件工程", Published = DateTime.Now.AddDays(), Excerpt = "ZouXin", Content = "Software Engineering" });
- postRecords.Add(new Post() { CategoryId = , Slug = "BOOK", Title = "编程之美", Published = DateTime.Now.AddDays(), Excerpt = "ZouXin", Content = "I Love Coding" });
- count = connection.Execute("insert into Posts values(@CategoryId, @Slug, @Title, @Published, @Excerpt, @Content);", postRecords);
④ 如何跨数据库读取数据记录:依赖于抽象,不依赖于具体
- static void GetPostsCrossMultiDB()
- {
- // 依赖于抽象,不依赖于具体
- using (IDbConnection connection = DbProviderFactories.GetFactory(connSetting.ProviderName).CreateConnection())
- {
- connection.ConnectionString = connSetting.ConnectionString;
- // 使用标准SQL语句屏蔽差异
- var postList = connection.Query<Post>("select * from Posts");
- foreach (var item in postList)
- {
- Console.WriteLine("ID:{0},Title:{1}", item.Id, item.Title);
- }
- }
- }
(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的读取和插入操作
- private static void ReadAllPostData()
- {
- using (var context = new MyAppDBContext())
- {
- var postList = context.Query<Post>("select * from Posts");
- foreach (var item in postList)
- {
- Console.WriteLine("ID:{0},Title:{1}", item.Id, item.Title);
- }
- }
- }
- private static void InsertNewPostData()
- {
- var post = new Post
- {
- CategoryId = ,
- Slug = "BOOK",
- Title = "Microsoft SQL Server 2008技术内幕",
- Content = Guid.NewGuid().ToString(),
- Excerpt = Guid.NewGuid().ToString(),
- Published = DateTime.Now
- };
- var count = post.Insert();
- Console.WriteLine("受影响行数:{0}", count);
- }
(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
轻量级ORM框架初探-Dapper与PetaPoco的基本使用的更多相关文章
- 轻量级ORM框架:Dapper中的一些复杂操作和inner join应该注意的坑
上一篇博文中我们快速的介绍了dapper的一些基本CURD操作,也是我们manipulate db不可或缺的最小单元,这一篇我们介绍下相对复杂 一点的操作,源码分析暂时就不在这里介绍了. 一:tabl ...
- C# 性能优化 之 秒表 Stopwatch。 Dapper一个和petapoco差不多的轻量级ORM框架
Sweet小马 小马同学的编程日记. C# 性能优化 之 秒表 Stopwatch. 生词解释:Diagnostics[,daɪəg'nɑstɪks] n.诊断学 using System.Diagn ...
- .NET轻量级ORM框架Dapper入门精通
一.课程介绍 本次分享课程包含两个部分<.NET轻量级ORM框架Dapper修炼手册>和<.NET轻量级ORM框架Dapper葵花宝典>,阿笨将带领大家一起领略轻量级ORM框架 ...
- 轻量级ORM框架Dapper应用一:Dapper安装
一.Dapper简介 Dapper是一款轻量级ORM框架,为解决网站访问流量极高而产生的性能问题而构造,主要通过执行TSQL表达式而实现数据库的CQRS. 如果你在项目中遇到性能访问问题,选择Dapp ...
- 分享自己写的基于Dapper的轻量级ORM框架~
1.说明 本项目是一个使用.NET Standard 2.0开发的,基于 Dapper 的轻量级 ORM 框架,包含基本的CRUD以及根据表达式进行一些操作的方法,目前只针对单表,不包含多表连接操作. ...
- c# 轻量级ORM框架 实现(一)
发布一个自己写的一个轻量级ORM框架,本框架设计期初基于三层架构.所以从命名上来看,了解三层的朋友会很好理解. 设计该框架的目的:不想重复的写增删改查,把精力放到功能实现上. 发布改框架的原因:希望给 ...
- 轻量级ORM框架 QX_Frame.Bantina(二、框架使用方式介绍)
轻量级ORM框架QX_Frame.Bantina系列讲解(开源) 一.框架简介 http://www.cnblogs.com/qixiaoyizhan/p/7417467.html 二.框架使用方式介 ...
- 轻量级ORM框架 QX_Frame.Bantina(一、框架简介)
轻量级ORM框架QX_Frame.Bantina系列讲解(开源) 一.框架简介 http://www.cnblogs.com/qixiaoyizhan/p/7417467.html 二.框架使用方式介 ...
- Dapper一个和petapoco差不多的轻量级ORM框架
我们都知道ORM全称叫做Object Relationship Mapper,也就是可以用object来map我们的db,而且市面上的orm框架有很多,其中有一个框架 叫做dapper,而且被称为th ...
随机推荐
- 卸载oracle 11g数据库软件
卸载oracle,从11g开始使用deinstall卸载数据库软件可以干净卸掉oracle $ cd $ORACLE_HOME/deinstall $ ls -l total 152 -rwxr-xr ...
- 大数据项目实践:基于hadoop+spark+mongodb+mysql+c#开发医院临床知识库系统
一.前言 从20世纪90年代数字化医院概念提出到至今的20多年时间,数字化医院(Digital Hospital)在国内各大医院飞速的普及推广发展,并取得骄人成绩.不但有数字化医院管理信息系统(HIS ...
- DataGridView回车焦点横向移动
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData ...
- js数组操作大全
原文(http://www.cnblogs.com/webhotel/archive/2010/12/21/1912732.html) 用 js有很久了,但都没有深究过js的数组形式.偶尔用用也就是简 ...
- mybatis map常用数据类型
JDBC Type Java Type CHAR String VARCHAR String LONGVARCHAR String NUMERIC java.math.BigDecimal DECIM ...
- nodejs复习05
stream 可读流 fs.pause()方法会使处于流动模式的流停止触发data事件,切换到非流动模式并让后续数据流在内部缓冲区 var fs = require('fs') var rs = fs ...
- ubuntu 用apt-get 安装apache 和php 之后php不能解析的问题
sudo apt-get install apache2 sudo apt-get install php7.0 sudo apt-get install libapache2-mod-php //关 ...
- my97DatePicker日期控件——日期输入框联动,使用focus使第二个输入框没展示出日期控件
描述问题场景: 1.jquery使用的版本是jquery-1.7.2.min.js 2.代码不是写在页面上的,是通过事件后追加的 <!DOCTYPE html> <html> ...
- bzoj1968真·想sha法bi题
本来想打表找规律的来着,,, 线性筛吗?一边筛一边累加答案?那不就不线性了吗...1e6悬啊 而且不是质因数个数而是因数个数,统计起来应该还要用数学方法 ...好尴尬 等一下,不要求质数的话我筛个p ...
- ORA-12560: TNS: 协议适配器错误
解决方案: 在开始菜单搜索 services.msc,进入本地服务 将 OracleOraDb11g_home1ClrAgent,OracleOraDb11g_home1TNSListener,Ora ...