** 1 ** ** .什么是 ORM?
**
ORM ,即 Object-Relational Mapping (对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的 SQL 语句打交道,只要像平时操作对象一样操作它就可以了。
对象关系映射( ORM )提供了概念性的、易于理解的模型化数据的方法。 ORM 方法论应当基于三个核心原则:
** 简单 ** :以最基本的形式建模数据。
** 传达性 ** :数据库结构被任何人都能理解的语言文档化。
** 精确性 ** :基于数据模型创建正确标准化了的结构。
基于三项原则,一方面,建模者通过收集来自那些熟悉应用程序但不熟练的数据建模者的人的信息开发企业实体模型,业务实体的设计者也可以在完全脱离数据结构构架的基础上应用这些业务实体并构筑企业的应用系统。另一方面我们可以将那些简单而又枯草地 SQL 语句完全忘却,在 ORM 的构架中,它们对于建模者应用来说完全是多余的。
** 2 ** ** . Snake.Net ** ** 中 ORM ** ** 的特点 ** :
Snake.Net 中的数据映射是基于 DataSet 对象的。 DataSet 对象是 Microsoft .NET 框架中数据访问的关键部分,是可保存表、视图和关系的内存中对象。 Snake.Net 中的数据映射是通过定义一个描述业务实体的 DataSet (如图 1.1 ),将其所需要应用到的数据表结构定义(表以及表与表之间的关系)进行描述。然后通过构建一个业务实体类( Class )并将类内特定域( Field )映射到 DataSet 中相对应数据表内的字段而实现的。
图 1.1 利用 Visual Sudio.Net 生成的 DataSet 结构定义
使用 DataSet 构架的优点有哪些?
业务实体与 DataSet 之间可以方便的进行相互转化,这种转化不仅实现于单个的业务实体,也可以对实现 IList 接口的业务实体集合进行批量转化。
通过 DataSet 可以实现对 XML 序列化的完全支持,也就是能够实现对 IXmlSerializable 接口的支持,从而便于分布式部署,以及对 SOAP 的支持。
DataSet 作为 Microsoft ADO.Net 重要的组成部分之一,通过 Visual Studio.Net 内置的工具就可以方便的生成 DataSet 结构的定义,从而有效地提高了开发的速度。
DataSet 对象是完全独立于数据库产品的对象,这也就为 Snake.Netd 对支持不同厂商不同版本的各类数据库产品的实现完全成为可能。
**
**
**
**
** 3 ** ** . ** ** 从构建一个业务实体开始
**
**
**
以上图 1.1 定义的 DataSet 为例,让我们从构建一个简单的 Customer 类开始。
[UniqueTypeDeclare( typeof (StringToken))]
public class Customer:DataBindObject
{
#region declare
[DataColumnMap( "CustomerID" )]
private string _id;
[DataColumnMap( "CompanyName" )]
private string _companyName;
[DataColumnMap( "ContactName" )]
private string _contactName;
[DataColumnMap( "ContactTitle" )]
private string _contactTitle;
[DataColumnMap( "Address" )]
private string _address;
[DataColumnMap( "City" )]
private string _city;
[DataColumnMap( "Region" )]
private string _region;
[DataColumnMap( "PostalCode" )]
private string _postalCode;
[DataColumnMap( "Country" )]
private string _country;
[DataColumnMap( "Phone" )]
private string _phone;
[DataColumnMap( "Fax" )]
private string _fax;
#endregion
#region constructors
public Customer( string id): this ( true )
{
//check for arguments
if (id == null ) throw new ArgumentNullException( "id" );
_id = id;
}
protected Customer( bool create): base (create)
{
}
#endregion
#region properties
_ public override IUnique Unique _ {
get {
return new StringToken(Id);
}
}
public string Id{
get { return _id = ( string )GetDataField(_id);}
}
public string CompanyName{
get { return _companyName = ( string )GetDataField(_companyName);}
set {_companyName = ( string )SetDataField(_companyName, value );}
}
public string ContactName{
get { return _contactName = ( string )GetDataField(_contactName);}
set {_contactName = ( string )SetDataField(_contactName, value );}
}
public string ContactTitle
{
get { return _contactTitle = ( string )GetDataField(_contactTitle);}
set {_contactTitle = ( string )SetDataField(_contactTitle, value );}
}
public string Address
{
get { return _address = ( string )GetDataField(_address);}
set {_address = ( string )SetDataField(_address, value );}
}
public string City{
get { return _city = ( string )GetDataField(_city);}
set {_city = ( string )SetDataField(_city, value );}
}
public string Region
{
get { return _region = ( string )GetDataField(_region);}
set {_region = ( string )SetDataField(_region, value );}
}
public string PostalCode
{
get { return _postalCode = ( string )GetDataField(_postalCode);}
set {_postalCode = ( string )SetDataField(_postalCode, value );}
}
<font s