LiteORM-For-DotNet,我的第一個開源庫

  • 2019 年 10 月 3 日
  • 筆記

這是一個DotNet輕量級ORM框架,解決C#.Net開發過程中重複繁瑣的資料庫CURD操作。

前言                                                                                                                                            

因工作中接手的.net項目,源碼裡面都用了動軟程式碼生成的源碼做為資料庫操作類庫。其中,有些根本就沒有用到,今後也不會用到的冗餘程式碼——垃圾程式碼。而每次如果有表結構修改,就得重新生成表實體/手動修改實體類,然後再修改程式碼中實體類邏輯,再修改DAL(資料庫訪問層)的賦值程式碼、sql欄位、數據類型。

 

於是,產生一個想法,借鑒EF的理念,利用反射技術,用表實體去操作資料庫,做增、改、刪、查處理。並且,將表實體類更精細化標註,增加了欄位名、主鍵、自增長、注釋【標題】、數據類型、長度的屬性標識,更有利於實體生成更優的sql腳本。

由此,通過反射技術把所有表CUDR操作的統一處理,以前修改了表結構,就得更新表實體類、修改邏輯程式碼、修改DAL。現在,只需求更新表實體及對應的邏輯程式碼就可以,不用再去維護DAL程式碼,幹掉那些每個DAL層中70%的程式碼,達到精簡程式碼,提高開發效率的目的。

有了這個想法,便開始了冗長的擼程式碼,斷斷繼繼歷經兩個月的時間,終於完成了構想的雛形。然後,又花點時間去了解一下怎麼玩github,把源碼庫傳到上面去。放出來,讓有需要的人拿去用,希望各位看官多多指教、發表意見,大家一起改進,完善。

下面奉上我的github地址,走過路過的都進來看看,給個Star就更好不過了。

 

詳情介紹                                                                                                                                                            

項目開源庫結構圖

 

 

 

1、YEasyModel

主要實體類反射類庫,定義實體類欄位的數據類型、長度、主鍵等特性;定義CURD方法,查詢參數表達式、排序表達式。利用lambda定義查詢邏輯,生成sql過濾條件;查詢/更新欄位定義,通過反射生成對應的Sql參數;排序邏輯定義,生成欄位排序規則;DataTable與實體類轉換方法。

2、ModelApp

winform程式,用於配置連接資料庫,定義命名空間、實體類名,生成指定的表/視圖的實體模型;

3、WebDemo

Webapi範例,簡單的表實體模型使用說明;

 

(暫時先寫這些,後面有時間再完善)

 

性能                                                                                                                                                    

以下四種不同方式查詢資料庫記錄並轉為實體類的測試:

m1DataSet實體表查詢記錄;

m2YEasyModel實體類工具查詢記錄;

m3,三層工廠模式查詢記錄,實例化一次,後面從快取取得實例;

m4Entity Framework查詢記錄;

查詢消耗的時間單位是毫秒。

 

第一次查詢1條記錄

 

 

 

第二次查詢1條記錄

 

 

 

第三次查詢1條記錄

 

 

  

第四次連續執行50次的查詢1條記錄

 

 

  

執行1次查詢8條記錄

 

 

  

連續執行50次的查詢8條記錄

 

 

  

根據以上多種測試結果對比得出:

m1 —— DataSet排第三;

m2 —— YEasyModel其次;

m3 —— 三層工廠模式最快,因為有實例化快取,第二次開始便不用再創建實例對象, 單條數據查詢時,速度優勢明顯。但需要維護的邏輯程式碼多;

m4 —— EF最慢,且劣勢明顯;太慢了!

測試程式碼:

using System;  using System.Collections.Generic;  using System.Linq;  using YEasyModel;    namespace WebApplication1.Tests  {      static class Program      {          /// <summary>          /// 應用程式的主入口點。          /// </summary>          [STAThread]          static void Main()          {              double m1 = 0;              double m2 = 0;              double m3 = 0;              double m4 = 0;              var c = new DBContext();              var bll = new STCT.BLL.CT_DiningInfo();              var aa = new DataSet1TableAdapters.CT_DiningInfoTableAdapter();              for (int i = 0; i < 50; i++)              {                  DateTime beforDT = System.DateTime.Now;                  DataSet1.CT_DiningInfoDataTable d = aa.GetData();                  DateTime afterDT = System.DateTime.Now;                  TimeSpan ts = afterDT.Subtract(beforDT);                  var msg = string.Format("DataSet.GetModel總共花費{0}ms.    ", ts.TotalMilliseconds);                  m1 = m1 + ts.TotalMilliseconds;                    beforDT = System.DateTime.Now;                  List<CT_DiningInfo> mmm = ModelDAL.Select<CT_DiningInfo>();                  afterDT = System.DateTime.Now;                  ts = afterDT.Subtract(beforDT);                  msg += string.Format("ModelUtil.Select 總共花費{0}ms.    ", ts.TotalMilliseconds);                  m2 = m2 + ts.TotalMilliseconds;                    beforDT = System.DateTime.Now;                  var list = bll.GetModelList("");                  afterDT = System.DateTime.Now;                  ts = afterDT.Subtract(beforDT);                  msg += string.Format("STCT.BLL.CT_DiningInfo()總共花費{0}ms.    ", ts.TotalMilliseconds);                  m3 = m3 + ts.TotalMilliseconds;                    //beforDT = System.DateTime.Now;                  //var ssss = (from a in c.DBCT_DiningInfo select a).ToList();                  ////var ll = c.DBCT_DiningInfo.AsNoTracking().ToList();                  //afterDT = System.DateTime.Now;                  //ts = afterDT.Subtract(beforDT);                  //msg += string.Format("EF Linq 總共花費{0}ms.    ", ts.TotalMilliseconds);                    beforDT = System.DateTime.Now;                  //var ssss = (from a in c.DBCT_DiningInfo select a).ToList();                  var ll = c.DBCT_DiningInfo.AsNoTracking().ToList();                  afterDT = System.DateTime.Now;                  ts = afterDT.Subtract(beforDT);                  msg += string.Format("EF總共花費{0}ms.    ", ts.TotalMilliseconds);                  m4 = m4 + ts.TotalMilliseconds;                    Console.WriteLine(msg);                  Console.WriteLine();              }                Console.WriteLine(string.Format("m1:{0}.      m2:{1}.      m3:{2}.      m4:{3}", m1, m2, m3, m4));              Console.WriteLine();                Console.Read();          }      }  }  

  

 

總結                                                                                                                                                   

(有空再寫)

最後,奉上github地址:https://github.com/michaelyes/LiteORM-For-DotNet