.Grove—— .Net下的ORM框架
参见原文:http://grove.91link.com(英)
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>
五、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 |
Decimal |
float |
Double |
image |
Byte[] |
int |
Int32 |
money |
Decimal |
nchar |
String Char[] |
ntext |
String Char[] |
numeric |
Decimal |
nvarchar |
String Char[] |
real |
Single |
smalldatetime |
DateTime |
smallint |
Int16 |
smallmoney |
Decimal |
sql_variant |
Object * |
text |
String Char[] |
timestamp |
Byte[] |
tinyint |
Byte |
uniqueidentifier |
Guid |
varbinary |
Byte[] |
varchar |
String Char[] |
.NET Framework Data Provider for OLE DB
OLE DB type |
.NET Framework type |
|
DBTYPE_I8 |
Int64 |
|
DBTYPE_BYTES |
Byte[] |
|
DBTYPE_BOOL |
Boolean |
|
DBTYPE_BSTR |
String |
|
DBTYPE_HCHAPTER |
Supported through the DataReader |
|
DBTYPE_STR |
String |
|
DBTYPE_CY |
Decimal |
|
DBTYPE_DATE |
DateTime |
|
DBTYPE_DBDATE |
DateTime |
|
DBTYPE_DBTIME |
DateTime |
|
DBTYPE_DBTIMESTAMP |
DateTime |
|
DBTYPE_DECIMAL |
Decimal |
|
DBTYPE_R8 |
Double |
|
DBTYPE_ERROR |
ExternalException |
|
DBTYPE_FILETIME |
DateTime |
|
DBTYPE_GUID |
Guid |
|
DBTYPE_IDISPATCH * |
Object |
|
DBTYPE_I4 |
Int32 |
|
DBTYPE_IUNKNOWN * |
Object |
|
DBTYPE_NUMERIC |
Decimal |
|
|