<p>一个简单O/R M组件(HFSoft.Data).NET</p> <p>一直想用O/R M的模式去开应用系统;但在。NET下又没有成熟的产品,nhibernate虽然不错但结构比较复杂,如果出现问题维护起来也比较麻烦。所以打算自己编写这样一个组件,在使用、维护和扩展方面的都比较容易把握;对项目的后期维护也比较有利。组件功能上也远比不上nhibernate,只实现了单表和视图的映射操作、查询对象化等功能。在设计的过程也参考了nhibernate的设计方式,毕竟nhibernate的设计不错可以直接拿过来使用。根据自己的情况修改一下就可以了。在设计时第一个考虑的问题就是组件对多类型数据库的支持,所以针对数据库提供者提取接口;在设计这个接口时nhibernate给我带来很大的启发;可以说是直接引用了它的设计原理。当数据库提供者接口完成后,就可以针对这个接口做数据库处理的工作了。IDataSession数据操作描述,包括找开连接、启用事务、插入对象、删除对象等操作。IDriverType数据库提供者描述,主要用于描述数据库类型关键的东西,如果数据库连接对象、对应的Command类型等。<br /> IExpression 条件表达式描述,用于处理查询过程中的条件;从些接口实现的条件表达式有:=、&gt;、&lt;&gt;、like、in等;组件还有很多对象进行内部处理的:类的映射信息,主要和忝相就应的SQL语句和命令对象;缓存类用于缓存操作命令对象、命令对持久化接口等。<br /> 类和数据库的关系映射 实体类和数据库表的关联采用了XML文件描述,相应对nhibernate业说比较简单. 以下是描述employees类和employees表对映象关系。 类文件<br /> using System;<br /> namespace NorthWind.Entitys<br /> {<br /> /// &lt;summary&gt;<br /> /// Employees<br /> /// &lt;/summary&gt;<br /> public class Employees<br /> {<br /> public Employees()<br /> {<br /> //<br /> // TODO: 在此处添加构造函数逻辑<br /> //<br /> }<br /> public const string F_EmployeeID=&quot;EmployeeID&quot;;<br /> private Int32 mEmployeeID;<br /> /// &lt;summary&gt;<br /> /// [int identity]<br /> /// &lt;/summary&gt;<br /> public Int32 EmployeeID<br /> {<br /> get<br /> {<br /> return mEmployeeID;<br /> }<br /> set<br /> {<br /> mEmployeeID = value;<br /> }<br /> }<br /> public const string F_LastName=&quot;LastName&quot;;<br /> private String mLastName;<br /> /// &lt;summary&gt;<br /> /// [nvarchar]<br /> /// &lt;/summary&gt;<br /> public String LastName<br /> {<br /> get<br /> {<br /> return mLastName;<br /> }<br /> set<br /> {<br /> mLastName = value;<br /> }<br /> }<br /> public const string F_FirstName=&quot;FirstName&quot;;<br /> private String mFirstName;<br /> /// &lt;summary&gt;<br /> /// [nvarchar]<br /> /// &lt;/summary&gt;<br /> public String FirstName<br /> {<br /> get<br /> {<br /> return mFirstName;<br /> }<br /> set<br /> {<br /> mFirstName = value;<br /> }<br /> }<br /> &hellip;&hellip;&hellip;&hellip;&hellip;&hellip;..<br /> &hellip;&hellip;&hellip;&hellip;&hellip;&hellip;.. 映射关系的XML文件<br /> &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;<br /> &lt;class name=&quot;NorthWind.Entitys.Employees,NorthWind.Entitys&quot; table=&quot;Employees&quot;&gt;<br /> &lt;id name=&quot;EmployeeID&quot; column=&quot;EmployeeID&quot; value=&quot;SELECT @@IDENTITY ,false&quot;/&gt;<br /> &lt;property name=&quot;LastName&quot; column=&quot;LastName&quot;/&gt;<br /> &lt;property name=&quot;FirstName&quot; column=&quot;FirstName&quot;/&gt;<br /> &lt;property name=&quot;Title&quot; column=&quot;Title&quot;/&gt;<br /> &lt;property name=&quot;TitleOfCourtesy&quot; column=&quot;TitleOfCourtesy&quot;/&gt;<br /> &lt;property name=&quot;BirthDate&quot; column=&quot;BirthDate&quot;/&gt;<br /> &lt;property name=&quot;HireDate&quot; column=&quot;HireDate&quot;/&gt;<br /> &lt;property name=&quot;Address&quot; column=&quot;Address&quot;/&gt;<br /> &lt;property name=&quot;City&quot; column=&quot;City&quot;/&gt;<br /> &lt;property name=&quot;Region&quot; column=&quot;Region&quot;/&gt;<br /> &lt;property name=&quot;PostalCode&quot; column=&quot;PostalCode&quot;/&gt;<br /> &lt;property name=&quot;Country&quot; column=&quot;Country&quot;/&gt;<br /> &lt;property name=&quot;HomePhone&quot; column=&quot;HomePhone&quot;/&gt;<br /> &lt;property name=&quot;Extension&quot; column=&quot;Extension&quot;/&gt;<br /> &lt;property name=&quot;Photo&quot; column=&quot;Photo&quot;/&gt;<br /> &lt;property name=&quot;Notes&quot; column=&quot;Notes&quot;/&gt;<br /> &lt;property name=&quot;ReportsTo&quot; column=&quot;ReportsTo&quot;/&gt;<br /> &lt;property name=&quot;PhotoPath&quot; column=&quot;PhotoPath&quot;/&gt;<br /> &lt;/class&gt;<br /> <br /> 组件的使用 当类和映射文件建立以后,就通过组件对类的操作来实现数据操作。为了实现动态配置,组件配置的方式和nhibernate是一样的,只是配置节有所不同。<br /> &lt;configSections&gt;<br /> &lt;section name=&quot;dataconfig&quot; type=&quot;HFSoft.Data.DataConfigSectionHandler, HFSoft.Data, Version=0.9.1.0, Culture=neutral, PublicKeyToken=null&quot; /&gt;<br /> &lt;/configSections&gt;<br /> &lt;dataconfig&gt;<br /> &lt;DriverType value=&quot;HFSoft.Data.SqlDriver, HFSoft.Data, Version=0.9.1.0, Culture=neutral, PublicKeyToken=null&quot;/&gt;<br /> &lt;ConnectionString value=&quot;data source=.;initial catalog=northwind;user id=sa;pwd=;&quot;/&gt;<br /> &lt;MappingAssemblys&gt;<br /> &lt;Assembly value=&quot;NorthWind.Entitys&quot;/&gt;<br /> &lt;/MappingAssemblys&gt;<br /> &lt;CacheCommands default=&quot;3&quot;/&gt;<br /> &lt;/dataconfig&gt;<br /> <br /> 添加一条雇员信息<br /> HFSoft.Data.MappingContainer mapContainer = HFSoft.Data.MappingContainer.ConfigContainer;<br /> using(HFSoft.Data.IDataSession session = mapContainer.OpenSession())<br /> {<br /> session.Open();<br /> NorthWind.Entitys.Employees emp = new NorthWind.Entitys.Employees();<br /> emp.ReportsTo = 3;<br /> emp.FirstName =&quot;fan&quot;;<br /> emp.LastName = &quot;henry&quot;;<br /> emp.Photo = new byte[0];<br /> emp.HireDate = DateTime.Parse(&quot;2002-12-31&quot;);<br /> emp.BirthDate = DateTime.Parse(&quot;1979-1-28&quot;);<br /> emp.City =&quot;广州&quot;;<br /> emp.Country =&quot;中国&quot;;<br /> session.Save(emp);<br /> MessageBox.Show(emp.EmployeeID.ToString());<br /> <br /> }<br /> <br /> 获取所有雇员信息<br /> using(HFSoft.Data.IDataSession session = mapContainer.OpenSession())<br /> {<br /> session.Open();<br /> System.Collections.IList myDS = session.List(typeof(NorthWind.Entitys.Employees),null);<br /> this.dataGrid1.DataSource = myDS;<br /> }<br /> 多条件查询(雇员编号大于等于3并且小于等于10或者姓包含fan)<br /> HFSoft.Data.Expression expression = new HFSoft.Data.Expression();<br /> expression.Add(new HFSoft.Data.RtEqExpression(NorthWind.Entitys.Employees.F_EmployeeID,3));<br /> expression.Add(new HFSoft.Data.LeEqExpression(NorthWind.Entitys.Employees.F_EmployeeID,10));<br /> expression.Add(HFSoft.Data.UintType.Or,new HFSoft.Data.LikeExpression(NorthWind.Entitys.Employees.F_FirstName,&quot;fan%&quot;));<br /> using(HFSoft.Data.IDataSession session = mapContainer.OpenSession())<br /> {<br /> session.Open();<br /> System.Collections.IList myDS = session.List(typeof(NorthWind.Entitys.Employees),expression);<br /> this.dataGrid1.DataSource = myDS;<br /> }<br /> 获取雇员信息并修改<br /> using(HFSoft.Data.IDataSession session = mapContainer.OpenSession())<br /> {<br /> session.Open();<br /> NorthWind.Entitys.Employees emp = (NorthWind.Entitys.Employees)session.Load(typeof(NorthWind.Entitys.Employees),41);<br /> emp.FirstName =&quot;kfc&quot;;<br /> session.Update(emp);<br /> <br /> }<br /> 组件为了提高效率,增加了缓存机制。可以通过配置文件制定对插入数据、修改数据的命令对象进行缓存的数量。当组件需要调用对象的插入命令时就会从缓存中找,当找不到的情况下才创建相关命令对象,这样会减少创建所带来的性能问题;同样缓存会占用相应的内存资源。组件现在还决少查询命令对象、数据集、实体对象的缓存。实体对象缓存比较复杂,中间还存在着和数据库信息同步、频繁锁的问题;还没有想到较好的解决方法,暂时没有打算把实体缓存集成到组件中。</p>
T:0.006571s,M:256.04 KB
返回顶部 留言