》对于应用程序行业领域来说,涉及到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
新闻热点
疑难解答