【原创】基于.NET的轻量级高性能 ORM - XFramework

【前言】接上一篇《【原创】打造基于Dapper的数据访问层》,Dapper在应付多表自由关联、分组查询、匿名查询等应用场景时不免显得吃力,经常要手写SQL语句(或者用工具生成SQL配置文件)。试想一下,项目中整个DAL层都塞满了SQL语句,对于后期维护来说无异于天灾人祸,这个坑谁踩谁知道。本框架在API设计上最大程度地借鉴EntityFramework的写法,干净的实体,丝滑的增删改查,稳健的导航...

【原创】基于.NET的轻量级高性能 ORM - XFramework

【前言】

  接上一篇《【原创】打造基于Dapper的数据访问层》,Dapper在应付多表自由关联、分组查询、匿名查询等应用场景时不免显得吃力,经常要手写SQL语句(或者用工具生成SQL配置文件)。试想一下,项目中整个DAL层都塞满了SQL语句,对于后期维护来说无异于天灾人祸,这个坑谁踩谁知道。本框架在API设计上最大程度地借鉴 EntityFramework 的写法,干净的实体,丝滑的增删改查,稳健的导航属性,另外还支持链式查询(点标记)、查询表达式、聚合查询等等。在实体映射转换层面,使用 Emit 来动态构建绑定指令,性能最大限度地接近原生水平。

【XFramework亮点】

  1. 原生.NET语法,零学习成本
  2. 支持LINQ查询、拉姆达表达式
  3. 支持批量增删改查和多表更新
  4. 支持 SqlServer、MySql、Postgre、Oracle,.NET Core
  5. 最大亮点,真正支持一对一、一对多导航属性。这一点相信现有开源的ORM没几个敢说它支持的
  6. 实体字段类型不必与数据库的类型一致
  7. 支持临时表、表变量操作
  8. 其它更多亮点,用了你就会知道

【性能】  

  看看与EntityFramework的性能对比,机器配置不同跑出来的结果可能也不一样,仅供参考。需要特别说明的是EntityFramework是用了AsNoTracking的,不然有缓存的话就没有比较的意义了。
  扯个题外话,有些ORM说比EntityFramework快百分多少多少,看起来挺美实际上在我看来那是在扯淡,没有任何参考价值。限制实体字段类型必须与数据库的一致不说,甚至连导航属性这种最基本的功能都不支持,这不在同一个等级同一个体量上的东西非要扯在一起比谁快,确定要这么幽默吗?本人非常推崇开源,也很尊重致力于开源的同行,但是像这种行为就非常有必要出来打假一波了。

  

【功能说明】

1.实体定义  

  1.1. 如果类有 TableAttribute,则用 TableAttribute 指定的名称做为表名,否则用类名称做为表名
  1.2. 实体的字段可以指定 ColumnAttribute 特性来说明实体字段与表字段的对应关系,删除/更新时如果传递的参数是一个实体,必须使用 [Column(IsKey = true)] 指定实体的主键
  1.3. ForeignKeyAttribute 指定外键,一对多外键时类型必须是 IList<T> 或者 List<T>
  1.4 ColumnAttribute.DataType 用来指定表字段类型。以SQLSERVER为例,System.String 默认对应 nvarchar 类型。若是varchar类型,需要指定[Column(DbType= DbType.AnsiString)]

 1[Table(Name = "Bas_Client")] 2public partial class Client 3   { 4 /// <summary> 5 /// 初始化 <see cref="Client"/> 类的新实例 6 /// </summary> 7 public Client() 8 { 9  this.CloudServerId = 0;10  this.Qty = 0;11  this.HookConstructor();12 }13 14 /// <summary>15 /// 初始化 <see cref="Client"/> 类的新实例16 /// </summary>17 public Client(Client model)18 {19  this.CloudServerId = 0;20  this.Qty = 0;21  this.HookConstructor();22 }23 24 /// <summary>25 /// clientid26 /// </summary>27 [Column(IsKey = true)]28 public virtual int ClientId { get; set; }29 30 /// <summary>31 /// clientcode32 /// </summary>33 public virtual string ClientCode { get; set; }34 35 /// <summary>36 /// clientname37 /// </summary>38 public virtual string ClientName { get; set; }39 40 /// <summary>41 /// cloudserverid42 /// </summary>43 [Column(Default = 0)]44 public virtual int CloudServerId { get; set; }45 46 /// <summary>47 /// activedate48 /// </summary>49 public virtual Nullable<DateTime> ActiveDate { get; set; }50 51 /// <summary>52 /// qty53 /// </summary>54 [Column(Default = 0)]55 public virtual int Qty { get; set; }56 57 /// <summary>58 /// state59 /// </summary>60 public virtual byte State { get; set; }61 62 /// <summary>63 /// remark64 /// </summary>65 [Column(Default = "'默认值'")]66 public virtual string Remark { get; set; }67 68 [ForeignKey("CloudServerId")]69 public virtual CloudServer CloudServer { get; set; }70 71 [ForeignKey("CloudServerId")]72  
源文地址:https://www.guoxiongfei.cn/cntech/18385.html