当前位置: 首页 > 工具软件 > FluentData > 使用案例 >

FluentData - 轻量级.NET ORM持久化技术解决方案

葛越泽
2023-12-01

一、什么是ORM

        ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。


二、使用ORM的优势

        优势一、 隐藏了数据访问细节,“封闭”的通用数据库交互,ORM的核心。它使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。快速开发,由此而来。 
        优势二、ORM使我们构造固化数据结构变得简单易行。
        在ORM年表的史前时代,我们需要将我们的对象模型转化为一条一条的SQL语句,通过直连或是DB helper在关系数据库构造我们的数据库体系。而现在,基本上所有的ORM框架都提供了通过对象模型构造关系数据库结构的功能。这相当不错。


三、使用ORM的缺点

        第一:无可避免的,自动化意味着映射和关联管理,代价是牺牲性能(早期,这是所有不喜欢ORM人的共同点)。现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。
        第二:面向对象的查询语言(X-QL)作为一种数据库与对象之间的过渡,虽然隐藏了数据层面的业务抽象,但并不能完全的屏蔽掉数据库层的设计,并且无疑将增加学习成本.
        第三:对于复杂查询,ORM仍然力不从心。虽然可以实现,但是不值的。视图可以解决大部分calculated column,case ,group,having,order by, exists,但是查询条件(a and b and not c and (d or d))。。。。。。
任何优势的背后都隐藏着缺点,这是不可避免的。问题在于,我们是否能容忍缺点。


四、.NET下的ORM框架有哪些?

现在市面上针对.NET ORM框架越来越多
微软自家的LINQ to SQL, ADO.NET Entity Framework不多说。  
 
商业: 
1.LightSpeed(免费版比较垃圾。表限制8个。另此厂商有NHibernate Designer工具)
 
http://www.mindscapehq.com/products/lightspeed  
 
2. Entityspaces(支持Access数据库,比较看好)。
 
http://www.entityspaces.net/portal/Home.aspx  
3.OpenAccess(有比较给力的免费版。)
 
http://www.telerik.com/products/orm.aspx  
 
4.eXpressPersistent Objects(XPO)(支持Access)
 
http://www.devexpress.com/products/NET/ORM/  
5.DataObjects.Net(自称对LINQ支持比较给力。但支持数据库比较少。有老版本的开源版)
 
http://dataobjects.net/
 
6.LLBLGen Pro (虽然支持的数据库比较多。但LINQ to SQL 只能用于MS SQL SERVER)
 
http://www.llblgen.com/defaultgeneric.aspx  
7.LinqConnect , Entity Developer 和 dotConnect Universal (产品比较乱。对LINQ支持比较给力。有自动生成代码和可视化的工具。)
 
http://www.devart.com/dotconnect/  
8.DataDirect Connect for ADO.NET(这个是ORM吗?应该和微软的产品合用)
 
http://www.datadirect.com/products/net/index.html  
 
9.ALINQ(国人开发。前期反编译了微软的SQL to SQL。后来自己写了各数据库provider发展而成。有免费版。中小型项目都可以用。但国人开发产品似乎充满困境。作者也开发了NHIbernate的代码生成器)
 
http://www.alinq.org/
 
开源
 
1.NHibernate(大名鼎鼎,发展不错。有很多书可学。)  
 
http://nhforge.org/Default.aspx
 
2.Castle ActiveRecord (建立在NHibernate之上,用.net attribute 映射。不过基本都用NHibernate了。Castle有好多项目可学习参考)
 
http://www.castleproject.org/castle/projects.html
 
3.SubSonic (性能是问题。更新缓慢)
 
http://subsonicproject.com/  
 
4. Opf3(貌似不更新了,可以学习用)
 
http://opf3.codeplex.com/  
 
5.MyBatis.NET (也不更新了。)
http://code.google.com/p/mybatisnet/  
 
6.BLToolkit(网站貌似被和 谐。这个看介绍挺不错。支持的数据库也不少。性能据说也行。但似乎国内没人用。)
 
http://bltoolkit.net/  
https://github.com/igor-tkachev/bltoolkit  
 
7.MyGeneration(代码自动生成工具和ORM。有各种模板。停止更新了)
 
http://www.mygenerationsoftware.com/portal/default.aspx  
 

五、几种常用框架的比较

以上就是市面上比较常见的.net ORM框架。其实比较完美的ORM框架应该是满足:
 
1.对象与数据库的映射
2.对象缓存
3.可视化设计和代码生成工具
4.支持多数据库
5.动态查询
6.延迟加载
7.非侵入式持久化
8.性能优良
9.支持存储过程和事务
10.多面向对象框架支持
 
ORM框架确实很方便,但发现也有其不足之处,比如多表联合查询,对视图和存储过程的处理不理想。整体性能低于面向SQL语句。
以上几种框架比较常用的应该是NHibernate,微软的EF及MyBatis.NET和FluentData。
上述几个框架各有优缺点
如:NHibernate 师出名门,大名鼎鼎的Hibernate厂商出品的专门针对.NET的ORM框架,优点是:功能强大,资料齐全,缺点是配置复杂,学习成本高
微软的EF自然是在VS开发中首推的,优点是和VS IDE集成很好,缺点是性能较NHiberte低,据说6.0后,性能明显加强,甚至于超过NHibernate,但本人未测,另外,对其他数据库的支持需要安装第三方插件,还有个人感觉也过于宠大,使用起来,不够灵活。MyBatic.NET功能和易用性介于NHibernate与EF之间。
相比较而言,笔者更推荐使用FluentData,一个轻量级开源的.NET ORM数据持久化框架。


六、什么是FluentData?

FluentData:一种使用Fluent API的新型轻量级ORM模型
FluentData 是微型 ORM(micro-ORM)家族的一名新成员,旨在比大型 ORM(full ORM)更加易用。FluentData 于本月推出,它使用 fluent API 并支持 SQL Server、SQL Azure、Oracle 和 MYSQL。
 
  FluentData 的设计者 Lars-Erik Kindblad 谈到:
 
当前市面上的 ORM 框架,如 Entity Framework 和 NHibernate,都过于复杂而且难于学习。此外,由于这些框架自身抽象的查询语言以及从数据库到 .NET 对象的映射太过麻烦,导致它们生成的 SQL 都很低效。
 
FluentData 另辟蹊径,它是一个轻量级框架,拥有简单的 fluent API 并且很容易学会。
 
  与其他微型 ORM(如 Dapper 和 Massive)类似,FluentData 关注性能和易用性。它允许开发人员拥有对 SQL 较多的控制,而不是依赖 ORM 进行自动生成。它不仅可以使用 SQL 来执行查询、增添和更新操作,还可以支持使用存储过程和事务。根据文档描述,FluentData 可以在不改动已有结构的情况下,与任何业务对象一同工作。
 
  以下是 FluentData 的一些其他特性:
 
· 多结果集(Multiple Result Set):在一次数据库操作下返回多个数据集;
· 开发人员可使用强类型对象或动态对象;
· 可为创建时需要特殊处理的复杂对象自定义实体工厂(Custom Entity Factory);
· 具有添加其他数据库支持的能力。
FluentData 需要 .NET 4.0,并支持 SQL Server、SQL Azure、SQL Server Compact 以及使用 .NET 驱动的 Oracle 和 MySQL。 想要了解进一步信息,如代码示例和免费下载,请访问CodePlex 站点上的 FluentData。(http://fluentdata.codeplex.com/)


七、快速上手如何使用FluentData

 下面我将一一举例向大家介绍FluentData在开发过程中的运用.
一:下载该项目并且引用FluentData.dll,或者直接在解决方案中添加该开源项目.项目地址:http://fluentdata.codeplex.com/
二.dll引用入到我们的数据业务层. 


1.)创建并且初始化一个IDbContext.
它是我们与数据库操作中的上下文,所有的有关数据操作都调用它下面的方法。初始化它的连接字符串web.config

 public static IDbContext QueryDB()
 {
       return new DbContext().ConnectionStringName("testDBContext", DbProviderTypes.SqlServer);
 }

2.)config中的连接字符串实例
<connectionStrings>
        <add name="testDBContext" connectionString="server=192.168.1.100;uid=sa;pwd=sa!;database=testDB;" />
</connectionStrings>

那么下面就可以在我们的数据业务层中根据自己的需求随心所欲的写sql了。
1.需要返回一个实体:
Product product = QueryDB().Sql(@"select * from Product
                    where ProductId = 1").QuerySingle<Product>();

2.根据参数返回一个实体?别急,尝尝那飘渺的链式操作吧
Product product = QueryDB().Sql("select * from Product where id=@id")
                      .Parameter("id", id)
                     .QuerySingle<Product>();

3.返回一个泛型。

List<Product> product = QueryDB().Sql("select * from Product where id=@id")
                      .Parameter("id", id)
                     .Query<Product>();

4.多表支持(这个楼主实际工作中倒是没有用到过)
using (var command = QueryDB().MultiResultSql())
    {
        List<Category> categories = command.Sql(
                @"select * from Category;
                select * from Product;").Query<Category>();
        List<Product> products = command.Query<Product>();
    }

5.插入操作
var productId = QueryDB().Insert("Product")
                    .Column("Name", "The Warren Buffet Way")
                    .Column("CategoryId", 1)
                    .ExecuteReturnLastId();

6.当然我喜欢写我牛B的sql。

var productId = QueryDB().Sql(@"insert into Product(Name, CategoryId)
                        values('The Warren Buffet Way', 1);").ExecuteReturnLastId();

7.修改操作.

QueryDB().Update("Product")
            .Column("Name", "The Warren Buffet Way")
            .Column("CategoryId", 1)
            .Where("ProductId", 1)
            .Execute();

8.删除操作 

QueryDB().Delete("Product").Where("ProductId", 1).Execute(); 

9.我想链式操作,我想写lambda表达式OK。

 QueryDB().Delete<Product>("Product")                                               
         .Where(x=>x.id,id)
         .Execute();

10.事物的处理
using (var context = QueryDB().UseTransaction)
{
        context.Sql("update Product set Name = @0 where ProductId = @1")
                    .Parameters("The Warren Buffet Way", 1)
                    .Execute();
        context.Sql("update Product set Name = @0 where ProductId = @1")
                    .Parameters("Bill Gates Bio", 2)
                    .Execute();
        context.Commit();
}

11.存储过程

 public static List<T> getPage<T>(string tableName,string tableFields, string sqlWhere,string order,int pageIndex, int pageSize, out int total)
 {
       var store = QueryDB().StoredProcedure("PF_Sys_PageControl")
                   .ParameterOut("totalPage", DataTypes.Int16)
                   .Parameter("tableName", tableName)
                   .Parameter("tableFields", tableFields)
                   .Parameter("sqlWhere", sqlWhere)
                   .Parameter("orderFields", order)
                   .Parameter("pageSize", pageSize)
                   .Parameter("pageIndex", pageIndex);
      var result=store.Query<T>()
}

上面贴的都是一些方法内容,具体的可以用方法封装下,当然该ORM是基于Freamework4.0的,Idbcontext接口下的方法也有支持返回一个动态类型的,所以扩展性也不弱,具体的就在于灵活的运用。






 类似资料: