** .Grove ** ** —— ** ** .Net ** ** 下的 ** ** ORM ** ** 框架 ** **
**
参见原文: http://grove.91link.com (英)
Grove 下载
** The .NET ORM Architecture ** ** ( ** ** .Net ORM ** ** 架构) **
一、 Grove 描述
Grove 是为 .Net 项目开发而设计的一个组件。 Grove ORM Development Toolkit 包含包含 Grove 和 Toolkit 两部分内容, Grove 基于 .Net 框架,支持多数据,提供标准的拖曳、三层及多层的开发模式。
二、 Grove 工具包
Grove 工具是一个基于 .Net 开发环境的附件,它能够从数据源直接查看到实体类与 XML 描述。例如单一对象或者关系对象(互相联系的对象),这里的几个 抓图屏幕 显示了它的一些描述。
三、 The ObjectOperator
The ObjectOperator 与数据进行通信,它使用 AppSettingManager 来设置数据源,如设置数据库服务器的连接字符串。 The ObjectOperator 使用 Attributes 决定在数据源中的字段与表与一个对象成员的映射关系,即字段与表做为一个持久性对象来使用与从数据源中返回一个对象成员属性。
The ObjectOperator 可能使用一个存在连接字符串来构造,或者你必须确保在当前项目的 Web.Config 文件中的 ConfigurationSettings 存在 AppSettings 节点,并设置 Key 属性值为 "DBConnString",Value 值为一个正确的连接字符串。
下面的例子显示了 ObjectOperator 的创建:
[System.Configuration.ConfigurationSettings.AppSettings["DBConnString"];]
ObjectOperator oo=new ObjectOperator();
[Custom Connection String]
ObjectOperator oo=new ObjectOperator("Server=localhost;Uid=sa;Pwd=sa;Database=sample");
ObjectOperator 提供了下列方法 , 主要功能是从一个数据源中返回对象 , 或者返回给数据源对象。
** Method **
|
** Description **
---|---
Insert
|
Insert an object into the data source
Update
|
Update an object
Remove
|
Delete an object from the data source
RemoveChilds
|
Delete child objects
Retrieve
|
Returns an object from the data source
RetrieveChilds
|
Returns child objects from the data source
GetDataReader
|
Returns an IDataReader from the data source
GetObjectSet
|
Returns a collection of object values
GetObjectSource
|
Returns a DataSet which contain the data source of the object
GetCount
|
Returns a records count of the data source
BeginTranscation
|
Begins a transaction at the data source, if transactions are supported by the data source.
Commit
|
Commits the current transaction.
Rollback
|
Rolls back the current transaction.
四、 The ObjectQuery
这 ObjectQuery 被用来帮助 ObjectOperator 从数据源中获得对象,例如, ObjectOperator 需要它来得到一个“ QueryString ”而加以执行, ObjectQuery 使用 Attributes 关键字决定当前对象引用单表或多表。
一个 ObjectQuery 对象的构造,通过传递一个对象类型或一个过滤字符串给 ObjectQuery 的构造函数,详细过滤定义,参考 _ Filter syntax _ (过滤语法)。例如,下面的 ObjectQuery 搜索所有 State 值等于“ WA ”的 Customer 对象。
ObjectQuery query=new ObjectQuery(typeof(Customer),"this.State='WA'");
为返回对象的所有数据类型,指定一个空的字符中作为你的过滤条件,如下例子:
ObjectQuery query=new ObjectQuery(typeof(Customer),"");
这 Filter 允许你在关系对象中使用“ Contains ”关键字定义字查询,你可以查询出存在定单数据超过 50 的
所有 Customer 对象。
ObjectQuery query = new ObjectQuery(typeof(Customer),”Order.CustomerID.Contains(this.CustomerID)”);
query.DeclareSubset(typeof(Order),”Order.Quantity> 50” );
五、 The FilterExpression (过滤表达式)
这 FilterExpression 是一个可扩展的过滤,即 FilterExpression 允许你偏离 ObjectQuery 来为一些操作构造许多复杂的条件,例如通过自定义条件来更新一个对象。
一个 FilterExpression 的创建,通过传递一个对象类型或传递一个过滤字符串给 ObjectQuery 的构造函数。
例如下面的 FilterExpression 定义了一个 State 等于“ WA ”的所有“ Customer 类型”的对象的过滤表达式。
FilterExpression filterex = new FilterExpression(typeof(Customer),”this.State=’WA’”);
这 Filter 允许你在关系对象中使用“ Contains ”关键字定义字查询,你可以查询出存在定单数据超过 50 的所有 Customer 对象。
FilterExpression filterex=new FilterExpression(typeof(Customer),"Order.CustomerID.Contains(this.CustomerID)");
filterex.DeclareSubset(typeof(Order),"Order.Quantity>50");
有时,我们需要更新一个对象的属性,而不更新其它属性。例如,仅仅需要更新 Customer 对象中 State 属性值,通过自定条件,如下所示:
ObjectOperator oo=new ObjectOperator();
oo.Update(typeof(Customer),filerex,"this.Status=1");
这个例子意思是将定单数量( Order )大于 50 的所有客户( Customer )的“ State ”的值设为 1 。
** Persisting Objects ** ** ** ** (持久性对象) ** **
**
一、 Mapping Object Properties (映射对象属性)
这 Grove ORM architecture 要求每一个持久性对象包含一个属性,这个属性值表示一个来自数据源的表的名字,此表名标示符在 Object Mapping ( 对象映射 ) 中用 DataTable 属性关键字来表示。
当从一个数据源中映射过来时,这 PK (主键字段)需要一个属性,来表示此字段为主键字段,例如,
[KeyField("CustomerID")]
public int CustomerID{get; set;}
如果这 PK Field( 主键字段 ) 不唯一,你必须确保这“ KeyType ”是“ UniquelType.OtherDefinition ”,下面的例子表示了字段类型是一个数据不唯一的 String( 字符串 ) 类型。
[KeyField("Field Name",KeyType=UniqueIDType.OtherDefinition)]
public string PropertyName{get; set;}
并且,这 PK field 也可以使用 ForeignKeyField 属性来表示来自数据源的一个字段名(外键)。、
[DataTable("Orders")]
public class Order
{
[ForeignKeyField("CustomerID")]
public int CustomerID{get; set;}
}
另外,其它字段也需要一个名为 DataField 的属性来表示来自数据源的表的字段。
[DataField("Field Name")]
public type PropertyName{get; set;}
当将数据源(表)映射成为对象时,你需要量将 the .NET framework data provider data types 映射成为 NET framework data types 。
下面的表显示了 .NET Framework type 与 Microsoft SQL Server, OLE DB, and ODBC. 的比较。详细信息请参考 .NET Framework Developer's Guide 。
注意:在 .NET Framework data provider data types 下的 Null 值被取代为 DBNull.Value 。
** .NET Framework Data Provider for SQL Server
**
** SQL Server type **
|
** .NET Framework type **
---|---
bigint
|
Int64
binary
|
Byte[]
bit
|
Boolean
char
|
String Char[]
datetime
|
DateTime
decimal
<td style="BORDER-RIGHT: gray 1pt inset; PADDING-RIGHT: 1.5pt; BORDER-TOP: gray 1pt inset; PADDING-LEFT: 1.5pt; PADDING-BOTTOM: 1.5pt; BORDER-LEFT: gray 1pt inset; WIDTH: 50%; PADDING-TOP