admin管理员组

文章数量:1530517

2024年7月10日发(作者:)

FluentData入门(一)--核心概念

DbContext类

这是FluentData的核心类,可以通过配置ConnectionString来定义这个类,如何连接数据库和

对具体DbContext类

这是FluentData的核心类,可以通过配置ConnectionString来定义这个类,如何连接数据库和

对具体的哪个数据库进行数据查询操作。

DbCommand类

这个类负责在相对应的数据库执行具体的每一个数据操作。

Events

DbContext类定义了以下这些事件:

OnConnectionClosed

OnConnectionOpened

OnConnectionOpening

OnError

OnExecuted

OnExecuting

可以在事件中,记录每个SQL查询错误或者SQL查询执行的 时间等信息。

Builders

Builder用来创建Insert, Update, Delete等相关的DbCommand实例。

Mapping

FluentData可以将SQL查询结果自动映射成一个POCO(POCO - Plain Old CLR Object)实体类,

也可以转换成一个dynamic类型。

自动转成实体类:

如果字段名中不包含下划线("_"),将映射到具有相同名字的属性上,例如:字段名 "Name" 将映

射到属性名 "Name"。

如果字段名中不包含下划线("_"),将映射到内嵌的属性上,例如:字段名 "CategoryName" 将映

射到属性名 ""。

如果数据库字段名和属性名不一致,可以使用SQL的as让他们一致。

自动转换成dynamic类型:

对应dynamic类型,会为每个字段生成一个同名的属性,例如:字段名 "Name" 将映射到属性名

"Name"。

什么时候应该主动释放资源?

如果使用UseTransaction或者UseSharedConnection,那么DbContext需要主动释放。

如果使用UseMultiResult或者MultiResultSql,那么DbCommand需要主动释放。

如果使用UseMultiResult,那么StoredProcedureBuilder需要主动释放。

其他所有的类都会自动释放,也就是说,一个数据库连接只在查询开始前才进行,查询结束后会马

上关闭。的哪个数据库进行数据查询操作。

DbCommand类

这个类负责在相对应的数据库执行具体的每一个数据操作。

Events

DbContext类定义了以下这些事件:

OnConnectionClosed

OnConnectionOpened

OnConnectionOpening

OnError

OnExecuted

OnExecuting

可以在事件中,记录每个SQL查询错误或者SQL查询执行的 时间等信息。

Builders

Builder用来创建Insert, Update, Delete等相关的DbCommand实例。

Mapping

FluentData可以将SQL查询结果自动映射成一个POCO(POCO - Plain Old CLR Object)实体类,

也可以转换成一个dynamic类型。

自动转成实体类:

如果字段名中不包含下划线("_"),将映射到具有相同名字的属性上,例如:字段名 "Name" 将映

射到属性名 "Name"。

如果字段名中不包含下划线("_"),将映射到内嵌的属性上,例如:字段名 "CategoryName" 将

映射到属性名 ""。

如果数据库字段名和属性名不一致,可以使用SQL的as让他们一致。

自动转换成dynamic类型:

对应dynamic类型,会为每个字段生成一个同名的属性,例如:字段名 "Name" 将映射到属性

名 "Name"。

什么时候应该主动释放资源?

如果使用UseTransaction或者UseSharedConnection,那么DbContext需要主动释放。

如果使用UseMultiResult或者MultiResultSql,那么DbCommand需要主动释放。

如果使用UseMultiResult,那么StoredProcedureBuilder需要主动释放。

其他所有的类都会自动释放,也就是说,一个数据库连接只在查询开始前才进行,查询结束后会马

上关闭。

FluentData入门(二)--创建DbContext

如何创建和初始化一个DbContext

可以在*.config文件中配置connection string,将connection string name或者将整个

connection string 作为参数传递给DbContext来创建DbContext。

重要配置

IgnoreIfAutoMapFails – IfAutoMapFails返回一个IDbContext,该实例中,

如果自动映射失败时是否抛出异常

通过*.config中配置的ConnectionStringName创建一个DbContext

1: public IDbContext Context()

2: {

3: return new DbContext().ConnectionStringName("MyDatabase",

4: new SqlServerProvider());

5: }

调用DbContext的ConnectionString方法显示设置connection string来创建

1: public IDbContext Context()

2: {

3: return new DbContext().ConnectionString(

4: "Server=MyServerAddress;Database=MyDatabase;Trusted_Connection=True;", new

SqlServerProvider());

5: }

其他可以使用的Provider

只有通过使用不同的Provider,就可以切换到不同类型的数据库服务器上,比如

AccessProvider, DB2Provider, OracleProvider, MySqlProvider, PostgreSqlProvider,

SqliteProvider, SqlServerCompact, SqlAzureProvider, SqlServerProvider.

FluentData入门(三)--Query

查询一组数据

返回一组dynamic对象(new in .NET 4.0)

1: List products = ("select * from

Product").QueryMany();

返回一组强类型对象

1: List products = ("select * from Product").QueryMany();

返回一个自定义的Collection

1: ProductionCollection products = ("select * from

Product").QueryMany();

返回单个对象

返回一个dynamic对象

1: dynamic product = (@"select * from Product where ProductId =

1").QuerySingle();

返回一个强类型对象:

1: Product product = (@"select * from Product where ProductId =

1").QuerySingle();

返回一个DataTable:

1: DataTable products = ("select * from Product").QuerySingle();

其实QueryMany和QuerySingle都可以用来返回DataTable,但考虑

到QueryMany返回的是List,所以使用QuerySingle来返

回DataTable更方便。

查询一个标量值

1: int numberOfProducts = (@"select count(*) from

Product").QuerySingle();

返回一组标量值

1: List productIds = (@"select ProductId from

Product").QueryMany();

设置查询参数:

索引顺序形式的参数

1: dynamic products = (@"select * from Product where ProductId = @0 or

ProductId = @1", 1, 2).QueryMany();

或者

1: dynamic products = (@"select * from Product where ProductId = @0 or

ProductId = @1").Parameters(1, 2).QueryMany();

名字形式的参数:

1: var command = (@"select @ProductName = Name from Product

2: where ProductId=1")

3: .ParameterOut("ProductName", , 100);

4: e();

5:

6: string productName = terValue("ProductName");

7:

8: List of parameters - in operator:

9: List ids = new List() { 1, 2, 3, 4 };

10:

11: dynamic products = (@"select * from Product

12: where ProductId in(@0)", ids).QueryMany();

Output 参数:

1: dynamic products = (@"select * from Product

2: where ProductId = @ProductId1 or ProductId = @ProductId2")

3: .Parameter("ProductId1", 1)

4: .Parameter("ProductId2", 2)

5: .QueryMany();

FluentData入门(四)--Mapping

映射

自动映射 – 在数据库对象和.Net object自动进行1:1匹配

1: List products = (@"select *

2: from Product")

3: .QueryMany();

自动映射到一个自定义的Collection:

1: ProductionCollection products = ("select * from

Product").QueryMany();

如果数据库字段和POCO类属性名不一致,使用SQL别名语法AS:

1: List products = (@"select p.*,

2: ryId as Category_CategoryId,

3: as Category_Name

4: from Product p

5: inner join Category c on ryId = ryId")

6: .QueryMany();

在这里p.*中的ProductId和ProductName会自动映射到tId和

tName,而Category_CategoryId和Category_Name 将映射到

ryId 和 .

使用dynamic自定义映射规则

1: List products = (@"select * from Product")

2: .QueryMany(Custom_mapper_using_dynamic);

3:

4: public void Custom_mapper_using_dynamic(Product product, dynamic row)

5: {

6: tId = tId;

7: = ;

8: }

使用datareader进行自定义映射:

1: List products = (@"select * from Product")

2: .QueryMany(Custom_mapper_using_datareader);

3:

4: public void Custom_mapper_using_datareader(Product product, IDataReader row)

5: {

6: tId = 32("ProductId");

7: = ing("Name");

8: }

或者,当你需要映射到一个复合类型时,可以使用QueryComplexMany或者

QueryComplexSingle。

1: var products = new List();

2: ("select * from Product").QueryComplexMany(products,

MapComplexProduct);

3:

4: private void MapComplexProduct(IList products, IDataReader reader)

5: {

6: var product = new Product();

7: tId = 32("ProductId");

8: = ing("Name");

9: (product);

10: }

多结果集

FluentData支持多结果集。也就是说,可以在一次数据库查询中返回多个查询结果。使用该特性的

时候,记得使用类似下面的语句对查询语句进行包装。需要在查询结束后把连接关闭。

1: using (var command = esultSql)

2: {

3: List categories = (

4: @"select * from Category;

5: select * from Product;").QueryMany();

6:

7: List products = any();

8: }

执行第一个查询时,会从数据库取回数据,执行第二个查询的时候,FluentData可以判断出这是一

个多结果集查询,所以会直接从第一个查询里获取需要的数据。

分页

1: List products = ("p.*, as Category_Name")

2: .From(@"Product p

3: inner join Category c on ryId = ryId")

4: .Where("tId > 0 and is not null")

5: .OrderBy("")

6: .Paging(1, 10).QueryMany();

调用 Paging(1, 10),会返回最先检索到的10个Product。

FluentData入门(五)—Insert, Update, Delete

插入数据

使用 SQL 语句:

1: int productId = (@"insert into Product(Name, CategoryId)

2: values(@0, @1);")

3: .Parameters("The Warren Buffet Way", 1)

4: .ExecuteReturnLastId();

使用builder:

1: int productId = ("Product")

2: .Column("Name", "The Warren Buffet Way")

3: .Column("CategoryId", 1)

4: .ExecuteReturnLastId();

使用builder,并且自动映射

1: Product product = new Product();

2: = "The Warren Buffet Way";

3: ryId = 1;

4:

5: tId = ("Product", product)

6: .AutoMap(x => tId)

7: .ExecuteReturnLastId();

8:

将ProductId作为AutoMap方法的参数,是要指明ProductId不需要进行映射,因为它是一个数

据库自增长字段。

更新数据

使用SQL语句:

1: int rowsAffected = (@"update Product set Name = @0

2: where ProductId = @1")

3: .Parameters("The Warren Buffet Way", 1)

4: .Execute();

使用builder:

1: int rowsAffected = ("Product")

2: .Column("Name", "The Warren Buffet Way")

3: .Where("ProductId", 1)

4: .Execute();

使用builder,并且自动映射:

1: Product product = (@"select * from Product

2: where ProductId = 1")

3: .QuerySingle();

4: = "The Warren Buffet Way";

5:

6: int rowsAffected = ("Product", product)

7: .AutoMap(x => tId)

8: .Where(x => tId)

9: .Execute();

将ProductId作为AutoMap方法的参数,是要指明ProductId不需要进行映射,因为它不需要被

更新。

Insert and update - common Fill method

1: var product = new Product();

2: = "The Warren Buffet Way";

3: ryId = 1;

4:

5: var insertBuilder = ("Product", product).Fill(FillBuilder);

6:

7: var updateBuilder = ("Product", product).Fill(FillBuilder);

8:

9: public void FillBuilder(IInsertUpdateBuilder builder)

10: {

11: (x => );

12: (x => ryId);

13: }

14:

15: Delete

删除数据

使用SQL语句:

1: int rowsAffected = (@"delete from Product

2: where ProductId = 1")

3: .Execute();

使用builder:

1: int rowsAffected = ("Product")

2: .Where("ProductId", 1)

3: .Execute();

FluentData入门(六)--存储过程和事务

存储过程

使用SQL语句

1: var rowsAffected = ("ProductUpdate")

2: .CommandType(Procedure)

3: .Parameter("ProductId", 1)

4: .Parameter("Name", "The Warren Buffet Way")

5: .Execute();

使用builder:

1: var rowsAffected = Procedure("ProductUpdate")

2: .Parameter("Name", "The Warren Buffet Way")

3: .Parameter("ProductId", 1).Execute();

使用builder,并且自动映射

1: var product = ("select * from Product where ProductId = 1")

2: .QuerySingle();

3:

4: = "The Warren Buffet Way";

5:

6: var rowsAffected = Procedure("ProductUpdate", product)

7: .AutoMap(x => ryId).Execute();

使用Lambda表达式

1: var product = ("select * from Product where ProductId = 1")

2: .QuerySingle();

3: = "The Warren Buffet Way";

4:

5: var rowsAffected = Procedure("ProductUpdate", product)

6: .Parameter(x => tId)

7: .Parameter(x => ).Execute();

事务

FluentData 支持事务。如果使用事务,最好使用using语句将代码包起来,已保证连接会被关闭。

默认的,如果查询过程发生异常,如事务不会被提交,会进行回滚。

1: using (var context = nsaction(true))

2: {

3: ("update Product set Name = @0 where ProductId = @1")

4: .Parameters("The Warren Buffet Way", 1)

5: .Execute();

6:

7: ("update Product set Name = @0 where ProductId = @1")

8: .Parameters("Bill Gates Bio", 2)

9: .Execute();

10:

11: ();

12: }

13:

实体工厂

实体工厂负责在自动映射的时候,生成POCO实例。如果需要生成复杂的实例,可以自定义实体工

厂:

1: List products = Factory(new CustomEntityFactory())

2: .Sql("select * from Product")

3: .QueryMany();

4:

5: public class CustomEntityFactory : IEntityFactory

6: {

7: public virtual object Resolve(Type type)

8: {

9: return Instance(type);

10: }

11: }

本文标签: 查询映射使用进行数据库