概述
FluentData(http://fluentdata.codeplex.com/) 的设计者 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。
环境准备
在MySql数据库设定如下表:
authors表和books
create table if not exists `authors` (
`authorid` int not null auto_increment,
`firstname` varchar(100) not null,
`middlename` varchar(100),
`lastname` varchar(100) not null,
primary key (`authorid` asc)
);
create table if not exists `books` (
`bookid` int not null auto_increment,
`title` varchar(200) not null,
`authorid` int,
`isbn` varchar(30),
primary key (`bookid` asc)
);
使用VS2012新建一个控制台应用程序的测试工程FluentTest
直接使用NuGet引用FluentData的库:
由于我们测试项目使用MySQL所以需要下载相应的库, 点此下载
至此我们的项目以及建立完成。
使用FluentData
-
配置连接字符串:
-
对应上面建立的2个表建立2个实体类:
public class Author
{
public int authorid { get; set; }
public string firstname { get; set; }
public string middlename { get; set; }
public string lastname { get; set; }
}
public class Book
{
public int bookid { get; set; }
public string title { get; set; }
public string isbn { get; set; }
public int authorid { get; set; }
}
}
可以看到这里的类的字段是需要和数据库的表字段一一对应,这在实际使用过程中会造成一些麻烦,在下一篇里我们再详细介绍不匹配的情况下如何处理。
-
引用库:
using FluentData;
-
创建并且初始化一个IDbContext
它是我们与数据库操作中的上下文,所有的有关数据操作都调用它下面的方法,其中testDBContext
是我们配置的连接字符串的名称,因为我们采用的数据库是MySQL所以使用MySqlProvider
public static IDbContext GetDBContext()
{
return new DbContext().ConnectionStringName("testDBContext", new MySqlProvider());
}
-
添加数据:
var authID = GetDBContext().Insert("authors")
.Column("firstname", "Joe")
.Column("middlename", "Mical")
.Column("lastname", "KT")
.ExecuteReturnLastId();
authID = GetDBContext().Insert("authors")
.Column("firstname", "Ser")
.Column("middlename", "Mifrretcal")
.Column("lastname", "Dew")
.ExecuteReturnLastId();
GetDBContext().Insert("books")
.Column("title", "Python学习")
.Column("authorid", "1")
.Column("isbn", "000321")
.ExecuteReturnLastId();
GetDBContext().Insert("books")
.Column("title", "领域建模")
.Column("authorid", "2")
.Column("isbn", "000333")
.ExecuteReturnLastId();
-
查询数据
Book Book = GetDBContext().Sql(@"select * from books
where bookid = 1").QuerySingle();
List auths = GetDBContext().Sql(@"select * from authors
").QueryMany();