》對于應用程序行業領域來說,涉及到Net框架的,在眾多支持大型項目的商用ORM框架中,使用最多的目前了解的主要有三款:
1、NHibernate(從java版移植來的Net版)、
2、微軟的EF、
3、還有就是今天提到的LLBLGen
》ORM之間的性能比較

從上圖的測試結果可以看出,傳統的手動編寫代碼訪問數據庫,例如手動編寫的ADO.NET,仍然是從數據庫中取值的最快捷的方式,性能依然最好。而相比于三大ORM框架來說由于NH的功能龐大EF的次之,LLBLGen相較于來說性能最好。當然對比ORM訪問數據庫的性能這一個側面并不能完全說明一切,緩存機制、延遲加載機制的配合使用已經可以大部分避免數據庫訪問性能損耗的影響。(題外話:既然傳統如Ado.net的訪問方式依然性能優異為何還要選用ORM的話題不做擴展)
》LLBLGen PRo是LLBLGen的數據庫訪問解決方案,她包含兩個部分:設計器(LLBLGen Pro designer)和運行時框架(LLBLGen Pro runtime framework).
》設計器生成的源碼除支持自身的運行時框架外,還支持另外三種數據庫映射框架產品:
》LLBLGen Pro支持的數據庫種類眾多:諸如MS access 2000/XP/2003/2007/2010、SQL Server 2000/2005/2008/2008R2/Express/MSDE/SQL Server CE Desktop、Oracle 9i/10g/11g、PostgreSql 7.4+/8.x+、Firebird 1.5.x/2.x、IBM DB2 7.x/8.x/9.x(非AS/400)、MySQL 4.x,5.x (使用Core Lab/DevArt MySql .NET提供器)、Sybase Adaptive Server Enterprise(ASE)/SQL iAnywhere(ASA)。主流的幾大數據庫基本都包含在內,所有其框架適應數據庫的兼容能力自然可不必太擔心,同一套源碼可以同時支持多種數據庫,而不需要額外花太多精力考慮代碼數據庫兼容問題。
》LLBLGen的詳細了解可訪問官網 http://www.llblgen.com/ 各種介紹資料、文檔和代碼示例均有
》在建立完業務模型并轉化為規范的數據庫實體后,LLBLGen框架的使用可以基本使你完全脫離繁瑣的數據存儲及展現查詢的各種操作過程,而專心于業務邏輯的開發。
》以LLBLGen Pro runtime framework自身的運行時框架為例,設計器的代碼生成自動將各種表視圖存儲過程等對于的視圖模型Entidy、接口Interface、操作類等完整生成。業務中僅關心調用即可.
常用代碼整理如下:
using SD.LLBLGen.Pro.ORMSupportClasses;using FactoryClasses;using HelperClasses;using RelationClasses;using DBAdapter;using EntityClasses;using ViewClasses;namespace ORM_Demo{ public class BLLCFUser:IBLLCFUser{ 按照規則自動生成的方法代碼,如下示例...(借鑒內部資料的整理) }}1、視圖查詢例: Select * From View_CF_User_All Where RecordStatus<>'InActive' Order By UserID Descpublic ViewCFUserAllTypedView FetchAllUser(){ DataAccessAdapter adapter = new DataAccessAdapter(); try { ViewCFUserAllTypedView user = new ViewCFUserAllTypedView(); RelationPredicateBucket bucket = new RelationPredicateBucket(); SortExpression sorter = new SortExpression(); //加過濾條件 bucket.PredicateExpression.Add(ViewCFUserAllFields.RecordStatus != "InActive"); //加排序條件 sorter.Add(ViewCFUserAllFields.UserID | SortOperator.Descending); adapter.FetchTypedView(user.GetFieldsInfo(), user, bucket, 0, sorter, true); return user; } catch { return null; } finally { adapter.Dispose(); }}對生成代碼的調用e.gORM_Demo orm = new ORM_Demo();ViewCFUserAllTypedView user = orm.FetchAllUser();if (user != null){ gridView.DataSource = user; gridView.DataBind();}2、表(記錄集合)查詢例: Select * From CF_Userpublic EntityCollection<DerivedCFUserEntity> FetchUser(){ DataAccessAdapter adapter = new DataAccessAdapter(); try { EntityCollection<DerivedCFUserEntity> user = new EntityCollection<DerivedCFUserEntity>(new DerivedCFUserEntityFactory()); RelationPredicateBucket bucket = new RelationPredicateBucket(); SortExpression sorter = new SortExpression(); adapter.FetchEntityCollection(user, bucket, 0, sorter); return user; } catch { return null; } finally { adapter.Dispose(); }}對生成代碼的調用e.gORM_Demo orm = new ORM_Demo();EntityCollection<DerivedCFUserEntity> user = orm.FetchUser();if (user != null){ gridView.DataSource = user; gridView.DataBind();}3、表(某一記錄)查詢例: Select * From CF_User Where LoginName='Admin' And RecordStatus<>'Inactive'public DerivedCFUserEntity FetchUserInfo(string loginName){ DataAccessAdapter adapter = new DataAccessAdapter(); try { DerivedCFUserEntity user = new DerivedCFUserEntity(); RelationPredicateBucket bucket = new RelationPredicateBucket(); bucket.PredicateExpression.Add(CFUserFields.LoginName == loginName); bucket.PredicateExpression.AddWithAnd(CFUserFields.RecordStatus != "Inactive"); user = (DerivedCFUserEntity)adapter.FetchNewEntity(new DerivedCFUserEntityFactory(), bucket); return user; } catch { return null; } finally { adapter.Dispose(); }}對生成代碼的調用e.gORM_Demo orm = new ORM_Demo();DerivedCFUserEntity user = orm.FetchUserInfo("Admin");if (user.UserID>0){ lblLoginName.Text = user.LoginName;}3-2、多表(多表查詢 Linq實現)》》using (DataAccessAdapter adapter = new DataAccessAdapter()){ LinqMetaData metaData = new LinqMetaData(adapter); var q = from t1 in metaData.CFEmployee join t2 in metaData.CFCompany on t1.CompanyID equals t2.CompanyID where t1.CompanyID < 100 select new { Addr = (t2.IRDAddress ?? "No Address"), t2.CreateUserID };}相當于select IsNull(t2.IRDAddress,"No Address"),t2.CreateUserIDfrom CFEmployee as t1inner join CFCompany as t2 on t1.CompanyID = t2.CompanyIDwhere t1.CompanyID < 100》》 using (DataAccessAdapter adapter = new DataAccessAdapter()) { List<int> ids = new List<int>() { 1, 2, 3 }; LinqMetaData metaData = new LinqMetaData(adapter); var q = from t1 in metaData.CFUser where ids.Contains(t1.UserID) select t1; }等同于SELECT * FROM CF_USER WHERE USERID IN (1, 2, 3)》》using (DataAccessAdapter adapter = new DataAccessAdapter()){ LinqMetaData metaData = new LinqMetaData(adapter); var q = from t1 in metaData.CFUser join t2 in metaData.CFEmployee on new { C = t1.RefRecordID, B = t1.CreateUserID } equals new { C = t2.EmployeeID, B = t2.CreateUserID } join t3 in metaData.CFAccount on new { D = t1.CreateUserID, E = t1.ModifyUserID } equals new { D = t3.CreateUserID, E = t3.ModifyUserID } select t1;}等同于SELECT LPA_L1.* FROM [CF_User] as [LPA_L1] INNER JOIN [CF_Employee] as [LPA_L2] ON ( [LPA_L1].[RefRecordID] = [LPA_L2].[EmployeeID] AND [LPA_L1].[CreateUserID] = [LPA_L2].[CreateUserID]))INNER JOIN [CFAccount] as [LPA_L3] ON ( [LPA_L1].[CreateUserID] = [LPA_L3].[CreateUserID]) AND [LPA_L1].[ModifyUserID] = [LPA_L3].[ModifyUserID])4、Insert操作(單表記錄新增)例: Insert CF_User(A,B,C) Values(……)public bool Add(string loginName, string passWord){ DataAccessAdapter adapter = new DataAccessAdapter(); adapter.StartTransaction(IsolationLevel.ReadCommitted, ""); try { DerivedCFUserEntity user = new DerivedCFUserEntity(); user.PrivClassID = 8; user.RefTable = "CF_Employee"; user.RefRecordID = 1; user.LoginName = loginName; user.Password = password; user.LanguageSelect = "CN"; user.IsManager = "N"; user.RegionalSetting = "zh-CN"; user.RecordStatus = "Active"; user.CreateUserID = 1; user.CreateDate = DateTime.Now; user.ModifyUserID = 1; user.ModifyDate = DateTime.Now; adapter.SaveEntity(user); adapter.Commit(); return true; } catch { adapter.Rollback(); return false; } finally { adapter.Dispose(); }}對生成代碼的調用e.gORM_Demo orm = new ORM_Demo();string loginName = "Amdin";string password = "111111";if (orm.Add(loginName, password)){ Alert("Success");}else{ Alert("Fail");}5、Update操作(單表記錄修改)例: Update CF_User Set RecordStatus='Inactive' Where UserID=100 //主鍵條件public bool Modify(int userID){ DataAccessAdapter adapter = new DataAccessAdapter(); adapter.StartTransaction(IsolationLevel.ReadCommitted, ""); try { DerivedCFUserEntity user = new DerivedCFUserEntity(userID); if (user.UserID < 1) { return false; } else { user.IsNew = false; adapter.FetchEntity(user); user.RecordStatus = "Inactive"; adapter.SaveEntity(user); adapter.Commit(); return true; } } catch { adapter.Rollback(); return false; } finally { adapter.Dispose(); }}對生成代碼的調用e.gORM_Demo orm = new O
新聞熱點
疑難解答