一个简单O/R M组件(HFSoft.Data).NET

一直想用 O/R M 的模式去开应用系统;但在。 NET 下又没有成熟的产品, nhibernate 虽然不错但结构比较复杂,如果出现问题维护起来也比较麻烦。所以打算自己编写这样一个组件,在使用、维护和扩展方面的都比较容易把握;对项目的后期维护也比较有利。组件功能上也远比不上 nhibernate, 只实现了单表和视图的映射操作、查询对象化等功能。在设计的过程也参考了 nhibernate 的设计方式,毕竟 nhibernate 的设计不错可以直接拿过来使用。根据自己的情况修改一下就可以了。

在设计时第一个考虑的问题就是组件对多类型数据库的支持,所以针对数据库提供者提取接口;在设计这个接口时 nhibernate 给我带来很大的启发;可以说是直接引用了它的设计原理。当数据库提供者接口完成后,就可以针对这个接口做数据库处理的工作了。

组件大体框架如下:

IDataSession

数据操作描述,包括找开连接、启用事务、插入对象、删除对象等操作。

IDriverType

数据库提供者描述,主要用于描述数据库类型关键的东西,如果数据库连接对象、对应的 Command 类型等。

IExpression

条件表达式描述,用于处理查询过程中的条件;从些接口实现的条件表达式有 := 、 > 、 <> 、 like 、 in 等;

组件还有很多对象进行内部处理的:类的映射信息,主要和忝相就应的 SQL 语句和命令对象;缓存类用于缓存操作命令对象、命令对持久化接口等。

** 类和数据库的关系映射

**

实体类和数据库表的关联采用了 XML 文件描述,相应对 nhibernate 业说比较简单 .

以下是描述 employees 类和 employees 表对映象关系。

类文件

using System;

namespace NorthWind.Entitys

{

///

1<summary>
2
3///  Employees 
4
5///  </summary>

public class Employees

{

public Employees()

{

//

// TODO: 在此处添加构造函数逻辑

//

}

public const string F_EmployeeID= "EmployeeID" ;

private Int32 mEmployeeID;

///

1<summary>
2
3///  [int identity] 
4
5///  </summary>

public Int32 EmployeeID

{

get

{

return mEmployeeID;

}

set

{

mEmployeeID = value ;

}

}

public const string F_LastName= "LastName" ;

private String mLastName;

///

1<summary>
2
3///  [nvarchar] 
4
5///  </summary>

public String LastName

{

get

{

return mLastName;

}

set

{

mLastName = value ;

}

}

public const string F_FirstName= "FirstName" ;

private String mFirstName;

///

1<summary>
2
3///  [nvarchar] 
4
5///  </summary>

public String FirstName

{

get

{

return mFirstName;

}

set

{

mFirstName = value ;

}

}

……………… ..

……………… ..

映射关系的 XML 文件

< class name ="NorthWind.Entitys.Employees,NorthWind.Entitys" table ="Employees">

< id name ="EmployeeID" column ="EmployeeID" value ="SELECT @@IDENTITY ,false"/>

< property name ="LastName" column ="LastName"/>

< property name ="FirstName" column ="FirstName"/>

< property name ="Title" column ="Title"/>

< property name ="TitleOfCourtesy" column ="TitleOfCourtesy"/>

< property name ="BirthDate" column ="BirthDate"/>

< property name ="HireDate" column ="HireDate"/>

< property name ="Address" column ="Address"/>

< property name ="City" column ="City"/>

< property name ="Region" column ="Region"/>

< property name ="PostalCode" column ="PostalCode"/>

< property name ="Country" column ="Country"/>

< property name ="HomePhone" column ="HomePhone"/>

< property name ="Extension" column ="Extension"/>

< property name ="Photo" column ="Photo"/>

< property name ="Notes" column ="Notes"/>

< property name ="ReportsTo" column ="ReportsTo"/>

< property name ="PhotoPath" column ="PhotoPath"/> ** 组件的使用

**

** ** 当类和映射文件建立以后,就通过组件对类的操作来实现数据操作。为了实现动态配置,组件配置的方式和 nhibernate 是一样的,只是配置节有所不同。

< configSections >

< section name ="dataconfig" type ="HFSoft.Data.DataConfigSectionHandler, HFSoft.Data, Version=0.9.1.0, Culture=neutral, PublicKeyToken=null" /> < dataconfig >

< DriverType value ="HFSoft.Data.SqlDriver, HFSoft.Data, Version=0.9.1.0, Culture=neutral, PublicKeyToken=null"/>

< ConnectionString value ="data source=.;initial catalog=northwind;user id=sa;pwd=;"/>

< MappingAssemblys >

< Assembly value ="NorthWind.Entitys"/>

&nbsp

Published At
Categories with Web编程
Tagged with
comments powered by Disqus