分享
 
 
 

Nhibernate拒绝配置文件(NHibernate.Mapping.Attributes的使用)

王朝c#·作者佚名  2006-12-17
窄屏简体版  字體: |||超大  

前言

通过使用NHibernate.Mapping.Attributes命名空间中的方法,可以不用写实体类的配置hbm.xml文件,只需要在相应实体类上加上适当标签,可以较大程度的提高开发效率,减少开发时间,并且不用再为那扰人的xml而烦扰。

1.原理

就是通过反射查找相应对象上的标签,然后动态生成与之前对应的hbm.xml流,然后加载至Configuration中。可见通过该种方式最重要的是相应的对象上加上正确并且需要的标签。这样就可以不再写或修改那烦人的xml文件。

2.准备工作

必须导入NHibernate.Mapping.Attributes命名空间,该命名空间属于NHibernate.Mapping.Attributes.dll文件中,该文件在NHibernateContrib-0.9.0.0中,可以到NHibernate网站下载。本文测试所采用的NHibernate和NHibernateContrib均是在0.9.0.0上测试通过。

3.如何加入标签

a.class上至少需加上[ClassAttribute(Table=Children)]

对应生成的xml片断如下

<class name='Models.Children, Models' table='Children'>

b.Id上加上如下所示标签

[Id(0, Name='Id',TypeType=typeof (int),Column='Id',UnsavedValue='0')]

[Key(1)]

[Generator(2, int Id

{

get { return _id; }

set { _id = value; }

}

其中0,1,2表示生成xml文件时属性的顺序,以上的标签最后生成可能是以下xml片断

<id name='Id' column='Id' type='Int32' unsaved-value='0'>

<generator />

</id>

c.其他一般属性需加上如下标签

[PropertyAttribute(Column='PName',Length=50,TypeType=typeof(String))]

public string PName

{

get { return _pName; }

set { _pName = value; }

}

对应xml片断

<property name='PName' type='String' column='PName' length='50' />

d.对于一对多情况加上如下标签

[Bag(0,Table='Children', Lazy=true, Cascade=CascadeStyle.All)]

[Key(1, Column='ParentId')]

[OneToManyAttribute(2, ClassType=typeof(Children))]

public IList Children

{

get { return _children; }

set { _children = value; }

}

对应xml片断如下

<bag name='Children' table='Children' lazy='true' cascade='all'>

<key column='ParentId' />

<one-to-many Models' />

</bag>

e.对于多对一的情况加上如下标签

[ManyToOne(0, ClassType=typeof (Parent),Column='ParentId',OuterJoin = OuterJoinStrategy.True)]

public Parent Parent

{

get { return _parent; }

set { _parent = value; }

}

对应的xml片断

<many-to-one name='Parent' Models' column='ParentId' outer-join='true' />

4.类写好了,标签也加上了,可以采用如下方式加入到Configuration

Configuration cfg = new Configuration();

using(MemoryStream stream = new MemoryStream())

{

for(int i=0;i<config.Count;i++)

{

HbmSerializer.Serialize(stream, System.Reflection.Assembly.Load('models'));

stream.Position = 0;

cfg.AddInputStream(stream);

}

}

4.容易出现的问题

漏掉标签,如:在Id上漏掉Name导致Search出来的对象Id都是0,漏掉级联或是其他

5.解决方法

a.可以将其动态产生的xml文件流输出到一个xml文件中,然后将输出的xml文件和之前的xml文件比对容易发现问题

输出到xml文件的代码如下:

FileStream fs = new FileStream(@'d:\DynamicHibernateMapping.xml',FileMode.Create);

fs.Write(stream.ToArray(),0,(Int32)stream.Length);

fs.Close();

b.列出一个属性标签清单,进行对比也可以

6.其他问题

欢迎私下交流,msn:eJimGao@msn.com

7.Table DDL

CREATE TABLE [dbo].[Children] (

[Id] [int] IDENTITY (1, 1) NOT NULL ,

[CName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,

[ParentId] [int] NULL

) ON [PRIMARY]

GO

CREATE TABLE [dbo].[Parent] (

[Id] [int] IDENTITY (1, 1) NOT NULL ,

[PName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL

) ON [PRIMARY]

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有