這是一個DotNet輕量級ORM框架,解決C#.Net開發過程中重覆繁瑣的資料庫CURD操作。 前言 因工作中接手的.net項目,源碼裡面都用了動軟代碼生成的源碼做為資料庫操作類庫。其中,有些根本就沒有用到,今後也不會用到的冗餘代碼——垃圾代碼。而每次如果有表結構修改,就得重新生成表實體/手動修改實 ...
這是一個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範例,簡單的表實體模型使用說明;
(暫時先寫這些,後面有時間再完善)
性能
以下四種不同方式查詢資料庫記錄並轉為實體類的測試:
m1,DataSet實體表查詢記錄;
m2,YEasyModel實體類工具查詢記錄;
m3,三層工廠模式查詢記錄,實例化一次,後面從緩存取得實例;
m4,Entity 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。