(三)NHibernate QuickStart:一气呵成的单对象持久化
概述:
写完了(二)NHibernate QuickStart:单个对象与单个数据表的持久化 ,我都很郁闷,诚然NHibernate减少了很多ADO.NET的操作,但是编写hbm.xml文件和DDL脚本还需要手工的去做。
一次还好,需求改变了这么办?比如对象增加了一个属性,还要改hbm.xml ,DDL这两个文件;hbm.xml文件写错了怎么办?这个映射文件的格式还是太麻烦。这些多出来的工作量好像不比写点ADO.NET少,有什么办法可以让系统自动的去干这些多出来的事吗?
还好,NHibernate提供了一套完整的办法来干这些多出来的事,一起看一下:
相关工程文件:AutoSimpleClass.rar (22KB)
原则:
1 编写业务类,在属性上加上O/R标签
2 自动生成hbm.xml文件和DDL文件
3 将生成的文件加入到项目中
步骤:
1 创建一个类库项目:AutoSimpleClass
2 将默认的类Class1.cs 改为 Cat.cs
3 在项目中引用以下组件:
NUnit.Framework.dll
NHibernate.dll
NHibernate.Mapping.Attributes.dll
4 在Cat.cs中引用NHibernate.Mapping.Attributes,并添加属性:
Cat.cs
5 在每个属性上增加数据表的对应关系
//定义对应的表
[Class(NameType = typeof(Cat), Table = "Cat")]
public class Cat
{
private
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
public Cat()
{
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/InBlock.gif)
//定义主键
[Id(0, Name = "ID", TypeType = typeof(int), Column = "Id", UnsavedValue = "0")]
[Key(1)]
[Generator(2, Class = "identity")]
public virtual string Id
{
get
{
return id;
}
set
{
id = value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
//定义一般字段
[PropertyAttribute(Column = "Name", Length = 50, TypeType = typeof(String))]
public virtual string Name
{
get
{
return name;
}
set
{
name = value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
//定义一般字段
[PropertyAttribute(Column = "Sex" , TypeType = typeof(Char))]
public virtual char Sex
{
get
{
return sex;
}
set
{
sex = value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
//定义一般字段
[PropertyAttribute(Column = "Weight", TypeType = typeof(float))]
public virtual float Weight
{
get
{
return weight;
}
set
{
weight = value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
}
public class HbmGenerator_Reflection
{
private string FullBusinessClassName = "AutoSimpleClass.Cat"; //修改此处,注意使用全类名,包含命名空间
}
写完了(二)NHibernate QuickStart:单个对象与单个数据表的持久化 ,我都很郁闷,诚然NHibernate减少了很多ADO.NET的操作,但是编写hbm.xml文件和DDL脚本还需要手工的去做。
一次还好,需求改变了这么办?比如对象增加了一个属性,还要改hbm.xml ,DDL这两个文件;hbm.xml文件写错了怎么办?这个映射文件的格式还是太麻烦。这些多出来的工作量好像不比写点ADO.NET少,有什么办法可以让系统自动的去干这些多出来的事吗?
还好,NHibernate提供了一套完整的办法来干这些多出来的事,一起看一下:
相关工程文件:AutoSimpleClass.rar (22KB)
原则:
1 编写业务类,在属性上加上O/R标签
2 自动生成hbm.xml文件和DDL文件
3 将生成的文件加入到项目中
步骤:
1 创建一个类库项目:AutoSimpleClass
2 将默认的类Class1.cs 改为 Cat.cs
3 在项目中引用以下组件:
NUnit.Framework.dll
NHibernate.dll
NHibernate.Mapping.Attributes.dll
4 在Cat.cs中引用NHibernate.Mapping.Attributes,并添加属性:
![](/Images/OutliningIndicators/ContractedBlock.gif)
5 在每个属性上增加数据表的对应关系
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
6 利用HbmGenerator.cs 包含的两个测试用例生成hbm.xml和DDL文件
代码不贴了,自己下,解压后注意修改命名空间。
结果如下:
7 将生成的文件添加到项目中,记得将xml文件作为嵌入的资源编译到程序集中
8 如果需要生成其它类的映射文件和数据库脚本,修改所有的Cat为你需要的业务类后,执行一遍单元测试即可。
9 什么? 要改的地方太多了,好吧,参考HbmGenerator_Reflection.cs ,利用了一下反射,只需要改一个地方就可以了。
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
版本记录:2008 - 1- 6 ,第一版发布
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步