EF、Chloe、SqlSugar、DOS.ORM四种ORM框架的对⽐
⽂章⽬录
四种orm框架的对⽐
1、什么是ORM?
答:ORM(Object-relational mapping)即对象关系映射,是⼀种为了解决⾯向对象与关系数据库存在的互不匹配的现象的技术。也就是说,ORM是通过使⽤描述对象和数据库之间映射的元数据(映射⽂件信息),将程序中的对象⾃动持久化到关系数据库中。说⽩了就是将
相应的实体映射到相应的数据库表,然后使⽤orm框架封装好的api进⾏数据库访问,减少了⾃⼰写数据库访问类的步骤。
2、ORM框架的优缺点是?
答:ORM框架的优点:(1)操作简单,提⾼开发效率。(2)⽀持⾯向对象封装。(3)可移植。(4)减少重复性代码
ORM框架的缺点:(1)处理多表联查之类的查询时,ORM的语法会变得很复杂。(2)执⾏性能较低(但现在有⼀些轻型ORM框架,性能接近原⽣SQL)。
2、四种框架的基本信息对⽐如下表:
框架/
对⽐
属性
SqlSugar Dos.ORM Chloe EFCodeFirst
⽀持数据库类型MySql、SqlServer、
Sqlite、Oracle 、
postgresql
MySql、SqlServer、Sqlite、Oracle 等数据库
MySql、SqlServer、
Sqlite、Oracle 、
postgresql
MySql、SqlServer、Sqlite、Oracle 、
postgresql
⽀持的
平台版
本
和net core和net core和net core和net core 团队规
模
少于10⼈公司性质未知微软
体积
895k(下载后
package的⼤⼩)
607k(下载后package的⼤⼩)
558k(下载后
package的⼤⼩)
17.8M
⽂档帮较全(install后,就可⼀般(但是很多细节的东西并没有告知⽤户,例
如需要通过代码⽣成器⽣成的实体类才能与数据
较全(install后,创建较全(⽆论是微软官⽅还是百度⾕歌,⽤
⽂档帮助较全(install后,就可
以直接使⽤了)
如需要通过代码⽣成器⽣成的实体类才能与数据
库进⾏映射)
较全(install后,创建
数据库即可直接使⽤)
较全(⽆论是微软官⽅还是百度⾕歌,⽤
的⼈⽐较多,遇到问题容易)
与数据库交互⽅式⽀持dbfirst、
codefirst
⽀持dbfirst⽀持dbfirst
⽀持code first(当前使⽤的是code
first,也可⽀持dbfirst)
学习成本低⼀般低
较⾼(刚开始使⽤会遇到许多的bug,虽
然⽹上都有解决⽅法,但是学习起来没前
⼏种容易)
框架/
对⽐
属性
SqlSugar Dos.ORM Chloe EFCodeFirst
3、四种框架的耗时情况如下:
如下表格,展⽰的是四种ORM框架Crud的性能,其中,(1)增查删改都是循环5次,每次增删改1万条数据,查询是每次查询10万条数据,取5次的平均值;(2)批量增删改都是循环5次,每次增删改10万条数据,取5次平均值:
类别/框架名称Chloe(单位:秒)DOS.ORM(单位:秒)EF(Code First)(单位:
秒)
SqlSugar(单位:
秒)
新增(Insert)13.906313.5712273.56312.4268
删除(Delete)13.668813.336665.132812.4202修改(Update)14.370414.330654.02112.084查询
(Select) 1.75020.23080.54860.1416
批量新增
(BulkInsert)
1.4382秒20.6162秒27.6674秒
2.7286秒
批量修改(BulkUpdate)0.5988秒(不⾜以⽤来参照,看下⾯
注解)
22.6556秒22.1634秒8.8188秒
批量删除(BulkDelete)0.7504秒(不⾜以⽤来参照,看下⾯
注解)
只能批量删除2009条,超过就
报错
20.336秒 5.7034秒
由上表可知,各种框架CRUD的性能如下(由快到慢):
(1)循环CRUD操作的性能如下:
新增:SqlSugar>DOS.ORM>Chloe>EF
sql语句实现的四种功能删除:SqlSugar>DOS.ORM>Chloe>EF
修改:SqlSugar>DOS.ORM>Chloe>EF
查询:SqlSugar>DOS.ORM>EF>Chloe
综上可知:SqlSugar框架的CRUD性能是最⾼的,其中EF除了查询⽐较快之外,删改所花费的时间都是其他三种框架的4~5倍,⽽新增就是20倍左右!
(2)循环批量CRUD的性能如下:
批量新增:Chloe>SqlSugar>DOS.ORM>EF
批量修改:Chloe>SqlSugar>EF>DOS.ORM
批量删除:Chloe>SqlSugar>EF
注解1:Chloe是有批量新增的⽅法BulkInsert,故其批量新增操作与其他框架⼀样。但是,Chloe没有批量修改、删除的⽅法,如下代码⽚段:
//下⾯的n表⽰1~5,是循环执⾏的次数,在上⾯的Insert步骤中分配插⼊了1万条"Chloe测试的数据1"、"Chloe测试的数据2"、"Chloe测试的数据3"、"Chloe测试的数据4"、"Chloe测试的数据5"
//Chloe只能通过lamdba表达式匹配到的数据进⾏删改,⽽不能直接在update()中添加⼀个list
context.Update<ORMTest>(a => a.Name == "Chloe测试的数据" + n, a => new ORMTest()
{
Name = "Chloe修改的数据" + n
});
context.Delete<ORMTest>(a => a.Name == "Chloe修改的数据" + n);
注解2:DOS.ORM批量删除超过2009条数据时就会报错,如下图:
综上,只有SqlSugar涵盖的⽅法⽐较多,⽽且速度也较快!
4、四种框架都⽀持哪些功能?
功能/框架Chloe DOS.ORM EF SqlSugar
增删查改⽀持⽀持⽀持⽀持
批量增删改⽀持⽀持⽀持⽀持事务、存储过程、⽇志⽀持⽀持⽀持⽀持
lamdba、执⾏SQL⽀持⽀持⽀持⽀持linq不⽀持不⽀持⽀持不⽀持多表查询、分组查询⽀持⽀持⽀持⽀持全局过滤器不⽀持不⽀持⽀持⽀持
答:四种框架都⽀持:
基本查询、多表查询、分组查询、批量增删改操作、存储过程、事务、执⾏SQL、⽇志等功能。
5、就个⼈使⽤⽽⾔,⽐较推荐哪个框架?
答:个⼈⽐较推荐SqlSugar,原因如下:
(1)只要下载了SqlSugar包后,就可以直接按照官⽹的例⼦进⾏编码,⽇志跟踪⽅⾯我认为是最简单已⽤的,且⽂档写得⽐较好、可由代码⽣成数据库,可以快速上⼿。
(2)Chloe与SqlSugar差不多,但是由于我觉得SqlSugar⽇志跟踪⽅⾯做得⽐较好且可以由代码⽣成
数据库,且Chloe对批量操作的⽀持不是很好,只能批量新增(且没有返回值),不能批量删除、修改,所以我才选择SqlSugar:
(3)Dos.ORM是这三个框架⾥⾯最不好上⼿,***不能***直接⾃⼰创建类⽂件,⽽是需要下载官⽹推荐的***代码⽣成器***去⽣成相应的类,然后才能进⾏数据库的访问,否则插⼊删除等操作都会报错,所以就个⼈⽽⾔,不推荐⽤这个,认为学习成本⽐其他两个⾼。
(5)四种框架中,SqlSugar进⾏CRUD的性能最⾼,⽽EF最慢。
6、SqlSugar的简单使⽤
(1)在nuget中输⼊Install-Package sqlSugar或nuget管理⼯具中搜索sqlSugar,下载sqlSugar包
(2)简单的实例
相应的实体类:
public class Student
{
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
[SugarColumn(IsNullable=true)]
public int? ClassessId { get; set; }
public override string ToString()
{
return this.Name + "的id为:" + this.Id + ",年龄为:" + this.Age;
}
}
public class Classess
{
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
public string Name { get; set; }
}
public class ORMTest
{
public int Id { get; set; }
public string Name { get; set; }
}
实例代码:
using SqlSugar;
using System;
using System.Configuration;
namespace SqlSugarTest
{
class Program
{
public static SqlSugarClient GetInstance()
{
SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
{
//ConnectionString = Config.ConnectionString,//数据库连接字符串
ConnectionString = connStr,
DbType = DbType.SqlServer,//数据库类型
IsAutoCloseConnection = true,⾃动释放数据务,如果存在事务,在事务结束后释放
IsAutoCloseConnection = true,⾃动释放数据务,如果存在事务,在事务结束后释放
InitKeyType = InitKeyType.Attribute//从实体特性中读取主键⾃增列信息
});
//关闭⽇志打印
//db.Aop.OnLogExecuting = (sql, pars) =>
//{
/
/ Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value))); // Console.WriteLine();
//};
return db;
}
//static string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
static string connStr = "server=DESKTOP-TROTQO7;uid=sa;pwd=123456;database=SqlSugarTest";
static void Main(string[] args)
{
var db = GetInstance();
#region 使⽤代码优先的⽅法创建数据库表
//使⽤Code first的⽅法,需要使⽤CreateDatabase⽅法创建数据库
//db.DbMaintenance.CreateDatabase();//创建数据库
//db.CodeFirst.SetStringDefaultLength(200).InitTables(typeof(Student));//根据实体类创建数据库表
//db.CodeFirst.SetStringDefaultLength(200).InitTables(typeof(Classess));//根据实体类创建数据库表
#endregion
#region 使⽤数据库优先的⽅法,根据数据库表⽣成相应的类⽂件
//注意:使⽤DbFirst数据库账户要有系统表的权限,否则⽆法读取表的结构
//1.将库⾥⾯所有表都⽣成实体类⽂件
//var modelStr = db.DbFirst.ToClassStringList();//根据数据库的表⽣成类字符串
//将数据库表⽣成相应的实体类,并存储到相应的路径中,SqlSugarTest表⽰⽣成的类的命名空间
//db.DbFirst.CreateClassFile("d:\\Demo", "SqlSugarTest");
#endregion
#region 插⼊(Insert)
//向student表中插⼊单条数据
//int result = db.Insertable(new Student { Name = "王五强", Age = 26 }).ExecuteCommand();
//向student表中批量插⼊数据
//var insertList = new Student[]
//{
// new Student { Name = "⼩明", Age = 16,ClassessId=1 },
// new Student { Name = "⼩红", Age = 18 ,ClassessId=1},
// new Student { Name = "⼩刚", Age = 20,ClassessId=2 },
// new Student { Name = "⼩刚", Age = 20,ClassessId=2 }
//};
/
/int result2 = db.Insertable(insertList).ExecuteCommand();//向student表中插⼊数据
//var insertList2 = new Classess[]
//{
// new Classess { Name = "⼀年⼀班", },
// new Classess { Name = "⼆年⼀班"},
//};
//int result3 = db.Insertable(insertList2).ExecuteCommand();//向student表中插⼊数据
#endregion
#region 查询(Select)
//InSingle中填的是数据的id,如果数据不存在,则返回null
//var model = db.Queryable<Student>().InSingle(1);//查询单条数据
First返回当前数据库表的第⼀条数据
//var model2 = db.Queryable<Student>().First();//获取第⼀条数据
//var selectList = db.Queryable<Student>().ToList();//查询所有数据
分页查询
//int totalCount = 0, totalPage = 0;
//var pageList = db.Queryable<Student>().ToPageList(2, 2, ref totalCount, ref totalPage);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论