轻量级ORM框架初探-Dapper与PetaPoco的基本使用

时间:2022-05-20 08:57:13

一、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数据模型

轻量级ORM框架初探-Dapper与PetaPoco的基本使用

  (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调试运行,首次查询结果如下图所示:

轻量级ORM框架初探-Dapper与PetaPoco的基本使用

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

二、Dapper

2.1 关于Dapper

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

2.2 使用Dapper

  (1)通过nuget添加Dapper组件

轻量级ORM框架初探-Dapper与PetaPoco的基本使用

  (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组件

轻量级ORM框架初探-Dapper与PetaPoco的基本使用

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

轻量级ORM框架初探-Dapper与PetaPoco的基本使用

  (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

作者:周旭龙

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

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

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

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

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

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

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

  3. &period;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&num; 轻量级ORM框架 实现&lpar;一&rpar;

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

  7. 轻量级ORM框架 QX&lowbar;Frame&period;Bantina(二、框架使用方式介绍)

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

  8. 轻量级ORM框架 QX&lowbar;Frame&period;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. easymock&plus;junit&plus;spring学习&&num;183&semi;

    Easymock学习                                Author:luojie 1.       Easymock简介 EasyMock 是一套通过简单的方法对于指定的 ...

  2. EF框架step by step&lpar;6&rpar;—处理实体complex属性

    上一篇的中介绍过了对于EF4.1框架中,实体的简单属性的处理 这一篇介绍一下Code First方法中,实体Complex属性的处理.Complex属性是将一个对象做为另一个对象的属性.映射到数据库中 ...

  3. hdu 1689 Just a Hook

    http://acm.hdu.edu.cn/showproblem.php?pid=1698 Just a Hook Time Limit: 4000/2000 MS (Java/Others)    ...

  4. CM记录-选择合适的硬件

    hadoop的运行环境---hadoop/jvm/os/hw 原则1:主节点的可靠性要好于从节点:NameNode(Yarn-ResourceManager).DataNode(NodeManager ...

  5. 大津法---OTSU算法

    简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景 ...

  6. 使用libcurl下载https地址的文件

    使用libcurl下载https地址的文件 void downLoadFile(std::string filename, std::string newFilename) { CURL *curl_ ...

  7. selenium的webdriver三种等待方式&lpar;显式等待WebDriverWait&plus;implicitly&lowbar;wait隐式等待&plus;sleep强制等待&rpar;

    隐式等待是等页面加载,不是等元素!!! 1.显式等待 一个显式等待是你定义的一段代码,用于等待某个条件发生然后再继续执行后续代码.显式等待是等元素加载!!! 2.隐式等待,相当于设置全局的等待,在定位 ...

  8. input标签(按钮)

    按钮: <input type="button" name="..." value="..." /> <input typ ...

  9. Ubuntu下安装virtualbox失败解决方案

    安装失败的截图: 因此使用常规方法:对依赖的两个包进行获取安装,依旧失败: 因此解决方法为在官网上下载相对应版本的virtualbox软件:下载地址为:https://www.virtualbox.o ...

  10. 【题解】洛谷P1198 &lbrack;JSOI2008&rsqb; 最大数(线段树)

    洛谷P1198:https://www.luogu.org/problemnew/show/P1198 思路 一道水水的线段树 20分钟A掉 这道题只涉及到单点修改和区间查询 所以这道题甚至不用Laz ...