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

前言
通过使用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片断如下

 1<class name="Models.Children, Models" table="Children">   
 2b.Id上加上如下所示标签   
 3[Id(0, Name="Id",TypeType=typeof (int),Column="Id",UnsavedValue="0")]   
 4[Key(1)]   
 5[Generator(2, Class="native")]   
 6public int Id   
 7{   
 8get { return _id; }   
 9set { _id = value; }   
10}   
11其中0,1,2表示生成xml文件时属性的顺序,以上的标签最后生成可能是以下xml片断   
12<id column="Id" name="Id" type="Int32" unsaved-value="0">
13<generator class="native"></generator>
14</id>   
15c.其他一般属性需加上如下标签   
16[PropertyAttribute(Column="PName",Length=50,TypeType=typeof(String))]   
17public string PName   
18{   
19get { return _pName; }   
20set { _pName = value; }   
21}   
22对应xml片断   
23<property column="PName" length="50" name="PName" type="String"></property>   
24d.对于一对多情况加上如下标签   
25[Bag(0,Table="Children", Lazy=true, Cascade=CascadeStyle.All)]   
26[Key(1, Column="ParentId")]   
27[OneToManyAttribute(2, ClassType=typeof(Children))]   
28public IList Children   
29{   
30get { return _children; }   
31set { _children = value; }   
32}   
33对应xml片断如下   
34<bag cascade="all" lazy="true" name="Children" table="Children">
35<key column="ParentId"></key>
36<one-to-many class="Models.Children, Models"></one-to-many>
37</bag>   
38e.对于多对一的情况加上如下标签   
39[ManyToOne(0, ClassType=typeof (Parent),Column="ParentId",OuterJoin = OuterJoinStrategy.True)]   
40public Parent Parent   
41{   
42get { return _parent; }   
43set { _parent = value; }   
44}   
45对应的xml片断   
46<many-to-one class="Models.Parent, Models" column="ParentId" name="Parent" outer-join="true"></many-to-one>   
474.类写好了,标签也加上了,可以采用如下方式加入到Configuration   
48Configuration cfg = new Configuration();   
49using(MemoryStream stream = new MemoryStream())   
50{   
51for(int i=0;i&lt;config.Count;i++)   
52{   
53HbmSerializer.Serialize(stream, System.Reflection.Assembly.Load("models"));   
54stream.Position = 0;   
55cfg.AddInputStream(stream);   
56}   
57}   
584.容易出现的问题   
59漏掉标签,如:在Id上漏掉Name导致Search出来的对象Id都是0,漏掉级联或是其他   
605.解决方法   
61a.可以将其动态产生的xml文件流输出到一个xml文件中,然后将输出的xml文件和之前的xml文件比对容易发现问题   
62输出到xml文件的代码如下:   
63FileStream fs = new FileStream(@"d:\DynamicHibernateMapping.xml",FileMode.Create);   
64fs.Write(stream.ToArray(),0,(Int32)stream.Length);   
65fs.Close();   
66b.列出一个属性标签清单,进行对比也可以   
676.其他问题   
68欢迎私下交流,msn:[email protected]   
697.Table DDL 
70
71CREATE TABLE [dbo].[Children] (   
72[Id] [int] IDENTITY (1, 1) NOT NULL ,   
73[CName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,   
74[ParentId] [int] NULL   
75) ON [PRIMARY]   
76GO 
77
78CREATE TABLE [dbo].[Parent] (   
79[Id] [int] IDENTITY (1, 1) NOT NULL ,   
80[PName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL   
81) ON [PRIMARY]</class>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus