第三篇FluentData轻量级NET ORM持久化技术详解Word格式.docx
《第三篇FluentData轻量级NET ORM持久化技术详解Word格式.docx》由会员分享,可在线阅读,更多相关《第三篇FluentData轻量级NET ORM持久化技术详解Word格式.docx(8页珍藏版)》请在冰豆网上搜索。
现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。
第二:
面向对象的查询语言(X-QL)作为一种数据库与对象之间的过渡,虽然隐藏了数据层面的业务抽象,但并不能完全的屏蔽掉数据库层的设计,并且无疑将增加学习成本.
第三:
对于复杂查询,ORM仍然力不从心。
虽然可以实现,但是不值的。
视图可以解决大部分calculatedcolumn,case,group,having,orderby,exists,但是查询条件(aandbandnotcand(dord))。
。
世上没有驴是不吃草的(又想好又想巧,买个老驴不吃草),任何优势的背后都隐藏着缺点,这是不可避免的。
问题在于,我们是否能容忍缺点
四、.NET下的ORM框架有哪些?
现在市面上针对.NETORM框架越来越多
微软自家的LINQtoSQL,ADO.NETEntityFramework不多说。
商业:
1.LightSpeed(免费版比较垃圾。
表限制8个。
另此厂商有NHibernateDesigner工具)
2.Entityspaces(支持Access数据库,比较看好,求破解)。
3.OpenAccess(有比较给力的免费版。
)
4.eXpressPersistentObjects(XPO)(支持Access)
5.DataObjects.Net(自称对LINQ支持比较给力。
但支持数据库比较少。
有老版本的开源版)
6.LLBLGenPro(虽然支持的数据库比较多。
但LINQtoSQL只能用于MSSQLSERVER)
7.LinqConnect,EntityDeveloper和dotConnectUniversal(产品比较乱。
对LINQ支持比较给力。
有自动生成代码和可视化的工具。
8.DataDirectConnectforADO.NET(这个是ORM吗?
应该和微软的产品合用)
9.ALINQ(国人开发。
前期反编译了微软的SQLtoSQL。
后来自己写了各数据库provider发展而成。
有免费版。
中小型项目都可以用。
但国人开发产品似乎充满困境。
作者也开发了NHIbernate的代码生成器)
http:
//www.alinq.org/
开源
1.NHibernate(大名鼎鼎,发展不错。
有很多书可学。
)
//nhforge.org/Default.aspx
2.CastleActiveRecord(建立在NHibernate之上,用.netattribute映射。
不过基本都用NHibernate了。
Castle有好多项目可学习参考)
//www.castleproject.org/castle/projects.html
3.SubSonic(性能是问题。
更新缓慢)
4.Opf3(貌似不更新了,可以学习用)
5.MyBatis.NET(也不更新了。
6.BLToolkit(网站貌似被和谐。
这个看介绍挺不错。
支持的数据库也不少。
性能据说也行。
但似乎国内没人用。
7.MyGeneration(代码自动生成工具和ORM。
有各种模板。
停止更新了)
五、几种常用框架的比较
以上就是市面上比较常见的.netORM框架。
其实比较完美的ORM框架应该是满足:
1.对象与数据库的映射
2.对象缓存
3.可视化设计和代码生成工具
4.支持多数据库
5.动态查询
6.延迟加载
7.非侵入式持久化
8.性能优良
9.支持存储过程和事务
10.多面向对象框架支持
ORM框架确实很方便,但发现也有其不足之处,比如多表联合查询,对视图和存储过程的处理不理想。
整体性能低于面向SQL语句。
以上几种框架比较常用的应该是NHibernate,微软的EF及MyBatis.NET和FluentData。
上述几个框架各有优缺点
如:
NHibernate师出名门,大名鼎鼎的Hibernate厂商出品的专门针对.NET的ORM框架,优点是:
功能强大,资料齐全,缺点是配置复杂,学习成本高
微软的EF自然是在VS开发中首推的,优点是和VSIDE集成很好,缺点是性能较NHiberte低,据说6.0后,性能明显加强,甚至于超过NHibernate,但本人未测,另外,对其他数据库的支持需要安装第三方插件,还有个人感觉也过于宠大,使用起来,不够灵活。
MyBatic.NET功能和易用性介于NHibernate与EF之间。
相比较而言,笔者更推荐使用FluentData,一个轻量级开源的.NETORM数据持久化框架
六、什么是FluentData?
FluentData:
一种使用FluentAPI的新型轻量级ORM模型
FluentData是微型ORM(micro-ORM)家族的一名新成员,旨在比大型ORM(fullORM)更加易用。
FluentData于本月推出,它使用fluentAPI并支持SQLServer、SQLAzure、Oracle和MYSQL。
FluentData的设计者Lars-ErikKindblad谈到:
当前市面上的ORM框架,如EntityFramework和NHibernate,都过于复杂而且难于学习。
此外,由于这些框架自身抽象的查询语言以及从数据库到.NET对象的映射太过麻烦,导致它们生成的SQL都很低效。
FluentData另辟蹊径,它是一个轻量级框架,拥有简单的fluentAPI并且很容易学会。
与其他微型ORM(如Dapper和Massive)类似,FluentData关注性能和易用性。
它允许开发人员拥有对SQL较多的控制,而不是依赖ORM进行自动生成。
它不仅可以使用SQL来执行查询、增添和更新操作,还可以支持使用存储过程和事务。
根据文档描述,FluentData可以在不改动已有结构的情况下,与任何业务对象一同工作。
以下是FluentData的一些其他特性:
∙多结果集(MultipleResultSet):
在一次数据库操作下返回多个数据集;
∙开发人员可使用强类型对象或动态对象;
∙可为创建时需要特殊处理的复杂对象自定义实体工厂(CustomEntityFactory);
∙具有添加其他数据库支持的能力。
FluentData需要.NET4.0,并支持SQLServer、SQLAzure、SQLServerCompact以及使用.NET驱动的Oracle和MySQL。
想要了解进一步信息,如代码示例和免费下载,请访问CodePlex站点上的FluentData。
(
七、快速上手如何使用FluentData
下面我将一一举例向大家介绍FluentData在开发过程中的运用.
一:
下载该项目并且引用FluentData.dll,或者直接在解决方案中添加该开源项目.项目地址:
二.dll引用入到我们的数据业务层.
1.)创建并且初始化一个IDbContext.
它是我们与数据库操作中的上下文,所有的有关数据操作都调用它下面的方法。
初始化它的连接字符串web.config
publicstaticIDbContextQueryDB()
{
returnnewDbContext().ConnectionStringName("
testDBContext"
DbProviderTypes.SqlServer);
}
2.)config中的连接字符串实例
<
connectionStrings>
addname="
connectionString="
server=192.168.1.100;
uid=sa;
pwd=sa!
;
database=testDB;
"
/>
/connectionStrings>
那么下面就可以在我们的数据业务层中根据自己的需求随心所欲的写sql了。
1.需要返回一个实体:
Productproduct=QueryDB().Sql(@"
select*fromProduct
whereProductId=1"
).QuerySingle<
Product>
();
2.根据参数返回一个实体?
别急,尝尝那飘渺的链式操作吧
Productproduct=QueryDB().Sql("
select*fromProductwhereid=@id"
.Parameter("
id"
id)
.QuerySingle<
3.返回一个泛型。
List<
product=QueryDB().Sql("
.Query<
4.多表支持(这个楼主实际工作中倒是没有用到过)
using(varcommand=QueryDB().MultiResultSql())
List<
Category>
categories=command.Sql(
@"
select*fromCategory;
select*fromProduct;
).Query<
products=command.Query<
5.插入操作
varproductId=QueryDB().Insert("
Product"
.Column("
Name"
"
TheWarrenBuffetWay"
CategoryId"
1)
.ExecuteReturnLastId();
6.当然我喜欢写我牛B的sql。
varproductId=QueryDB().Sql(@"
insertintoProduct(Name,CategoryId)
values('
TheWarrenBuffetWay'
1);
).ExecuteReturnLastId();
7.修改操作.
QueryDB().Update("
.Where("
ProductId"
.Execute();
同上,也可以不用update()方法,而直接写sql.
8.删除操作
QueryDB().Delete("
).Where("
1).Execute();
9.我想链式操作,我想写lambda表达式OK。
QueryDB().Delete<
("
.Where(x=>
x.id,id)
10.事物的处理
using(varcontext=QueryDB().UseTransaction)
context.Sql("
updateProductsetName=@0whereProductId=@1"
.Parameters("
BillGatesBio"
2)
context.Commit();
在事物的操作中记得context.Commit();
方法的执行,楼主曾经在自己的一个项目中需要用到事物,却忘记了执行提交这个方法,最后在源码的汪洋中探索许久
11.存储过程
有关存储过程的使用,楼主在实际项目开发中,用上了存储过程。
该存储过程的作用是分页,那么这里也贴出来分享一下
publicstaticList<
T>
getPage<
(stringtableName,stringtableFields,stringsqlWhere,stringorder,intpageIndex,intpageSize,outinttotal)
{
varstore=QueryDB().StoredProcedure("
PF_Sys_PageControl"
.ParameterOut("
totalPage"
DataTypes.Int16)
tableName"
tableName)
tableFields"
tableFields)
sqlWhere"
sqlWhere)
orderFields"
order)
pageSize"
pageSize)
pageIndex"
pageIndex);
varresult=store.Query<
()
上面贴的都是一些方法内容,具体的可以用方法封装下,当然该ORM是基于Freamework4.0的,Idbcontext接口下的方法也有支持返回一个动态类型的,所以扩展性也不弱。
具体的就在于灵活的运用。
至此;
写到这里一定很激动了吧,大伙有时间有机会的话,也去尝试下吧。
关于NHibernate及EF在北风网官网上能找到我的教程,但关于FluentData的这个ORM框架的视频市面上虽有,却少,而且不系统完整,兼与此,
我自己计划出一些关于FluentData的教学视频,已经在进行中,照例给出思维导图及已完成的视频,需了解更多的可以给我留言,希望我的付出对您有所帮助。
已经录制好的视频有如下十二讲,后面计划会结合具体的案例项目更深入的讲解
本次先公开课程的前三讲及部分代码(说明:
代码请用VS2012打开),供大家入门参考!