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);
· 具備添加其餘數據庫支持的能力。 html
FluentData 須要 .NET 4.0,並支持 SQL Server、SQL Azure、SQL Server Compact 以及使用 .NET 驅動的 Oracle 和 MySQL。 想要了解進一步信息,如代碼示例和免費下載,請訪問CodePlex 站點上的 FluentData。(http://fluentdata.codeplex.com/)web
快速上手如何使用FluentData
下面我將一一舉例向你們介紹FluentData在開發過程當中的運用. sql
一:下載該項目而且引用FluentData.dll,或者直接在解決方案中添加該開源項目.項目地址:http://fluentdata.codeplex.com/ 數據庫
二.dll引用入到咱們的數據業務層.
1.)建立而且初始化一個IDbContext.
它是咱們與數據庫操做中的上下文,全部的有關數據操做都調用它下面的方法。初始化它的鏈接字符串web.config app
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了。 ide
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.返回一個泛型。 ui
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()
同上,也能夠不用update()方法,而直接寫sql.
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(); }
在事物的操做中記得context.Commit();方法的執行,樓主曾經在本身的一個項目中須要用到事物,卻忘記了執行提交這個方法,最後在源碼的汪 洋中探索許久
11.存儲過程
有關存儲過程的使用,樓主在實際項目開發中,用上了存儲過程。該存儲過程的做用是分頁,那麼這裏也貼出來分享一下
public static List<T> getPage<T>(string tableName,string tableFields, string sqlWhere,string order,intpageIndex, 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>() }