NHibernate一对多,多对一关系映射的一些心得 .

来源:互联网 发布:网络剧输出到电视台 编辑:程序博客网 时间:2024/06/06 02:34

不知道为什么,用代码生成工具MyGeneration生成映射关系后,只有数据库字段的,而反应表之间对应关系的一些映射生成不出来,只有手写,做个备忘。

我理解的不知道对不对,高手看到请指正.

以user(用户表)和doc(文章表)为例

user表字段:uid(主键)、uname                         实体类Users.cs          命名空间test

doc表字段:docid(主键)、doctext、userid       实体类Docs.cs            命名空间test

关系为:用户表user 对应 文章表doc 是一对多关系

                文章表doc对应 用户表user  是多对一关系

 

多对一关系:

文章表doc的xml:

[html] view plaincopyprint?
  1. <property name="userid" column="userid" type="int" />  

改为

[html] view plaincopyprint?
  1. <!--doc表中的列userid对应Users(用户表实体类)表的主键,Userinfo是用户表的对象-->  
  2. <many-to-one name="Userinfo" column="userid" class="Users,test">  
  3. </many-to-one>  

文章表doc的实体类     Docs.cs      中加入对User的操作

[csharp] view plaincopyprint?
  1. public virtual Users Userinfo  
  2. {  
  3.     get;  
  4.     set;  
  5. }  

nhibernate会自动将对应的用户关联上。得到用户:

[css] view plaincopyprint?
  1. 结果集.Userinfo.uname;  

 


一对多关系:

用户表的xml,加上

[html] view plaincopyprint?
  1. <bag name="DocsList" inverse="true" lazy="true" cascade="none">  
  2.   <key column="userid" />  
  3.   <one-to-many class="Docs,test" />  
  4. </bag>  

key column表示本表的主键要和子表哪个字段对应,这里为userid,表示用户表user的的主键uid和Doc表中的userid对应,name="DocsList"表示对应表doc的对象

用户表user的实体类       Docs.cs      加上

[csharp] view plaincopyprint?
  1. private IList<Docs> _docs;  
  2. public virtual IList<Docs> DocsList  
  3. {  
  4.     get { return _docs; }  
  5.     set { _docs= value; }  
  6. }  

nhibernate会自动将用户对应的文章关联上,得到用户文章数

[csharp] view plaincopyprint?
  1. 结果集.DocList.count;  

 

注意:

cascade:有all、save-update、delete、none几个选项,表示  该表做一些操作时 是否作用于 关联的表,比如在一对多关系中如果cascade="all"时,那么父表所做的操作都会作用于子表,比如删除某个用户,那么这个用户下的文章也会关联一起删除。

映射属性:

  • access(默认property):可选field、property、nosetter、ClassName值。NHibernate访问属性的策略。
  • cascade(可选):指明哪些操作会从父对象级联到关联的对象。可选all、save-update、delete、none值。除none之外其它将使指定的操作延伸到关联的(子)对象。
  • class(默认通过反射得到属性类型):关联类的名字。
  • column(默认属性名):列名。
  • fetch(默认select):可选select和join值,select:用单独的查询抓取关联;join:总是用外连接抓取关联。
  • foreign-key:外键名称,使用SchemaExport工具生成的名称。
  • index:......
  • update,insert(默认true):指定对应的字段是否包含在用于UPDATE或INSERT 的SQL语句中。如果二者都是false,则这是一个纯粹的 “外源性(derived)”关联,它的值是通过映射到同一个(或多个)字段的某些其他特性得到或者通过触发器其他程序得到。
  • lazy:可选false和proxy值。是否延迟,不延迟还是使用代理延迟。
  • name:属性名称propertyName。
  • not-found:可选ignore和exception值。找不到忽略或者抛出异常。
  • not-null:可选true和false值。
  • outer-join:可选auto、true、false值。
  • property-ref(可选):指定关联类的一个属性名称,这个属性会和外键相对应。如果没有指定,会使用对方关联类的主键。这个属性通常在遗留的数据库系统使用,可能有外键指向对方关联表的某个非主键字段(但是应该是一个唯一关键字)的情况下,是非常不好的关系模型。比如说,假设Customer类有唯一的CustomerId,它并不是主键。这一点在NHibernate源码中有了充分的体验。
  • unique:可选true和false值。控制NHibernate通过SchemaExport工具生成DDL的过程。
  • unique-key(可选):使用DDL为外键字段生成一个唯一约束。
0 0
原创粉丝点击