不知道为什么,用代码生成工具MyGeneration生成映射关系后,只有数据库字段的,而反应表之间对应关系的一些映射生成不出来,只有手写,做个备忘。
我理解的不知道对不对,高手看到请指正.
以user(用户表)和doc(文章表)为例
user表字段:uid(主键)、uname 实体类Users.cs 命名空间test
doc表字段:docid(主键)、doctext、userid 实体类Docs.cs 命名空间test
关系为:用户表user 对应 文章表doc 是一对多关系
文章表doc对应 用户表user 是多对一关系
多对一关系:
文章表doc的xml:
将
- <property name="userid" column="userid" type="int" />
<property name="userid" column="userid" type="int" />
改为
- <!--doc表中的列userid对应Users(用户表实体类)表的主键,Userinfo是用户表的对象-->
- <many-to-one name="Userinfo" column="userid" class="Users,test">
- </many-to-one>
<!--doc表中的列userid对应Users(用户表实体类)表的主键,Userinfo是用户表的对象-->
<many-to-one name="Userinfo" column="userid" class="Users,test">
</many-to-one>
文章表doc的实体类 Docs.cs 中加入对User的操作
- public virtual Users Userinfo
- {
- get;
- set;
- }
public virtual Users Userinfo
{
get;
set;
}
nhibernate会自动将对应的用户关联上。得到用户:
- 结果集.Userinfo.uname;
结果集.Userinfo.uname;
一对多关系:
用户表的xml,加上
- <bag name="DocsList" inverse="true" lazy="true" cascade="none">
- <key column="userid" />
- <one-to-many class="Docs,test" />
- </bag>
<bag name="DocsList" inverse="true" lazy="true" cascade="none">
<key column="userid" />
<one-to-many class="Docs,test" />
</bag>
key column表示本表的主键要和子表哪个字段对应,这里为userid,表示用户表user的的主键uid和Doc表中的userid对应,name="DocsList"表示对应表doc的对象
用户表user的实体类 Docs.cs 加上
- private IList<Docs> _docs;
- public virtual IList<Docs> DocsList
- {
- get { return _docs; }
- set { _docs= value; }
- }
private IList<Docs> _docs;
public virtual IList<Docs> DocsList
{
get { return _docs; }
set { _docs= value; }
}
nhibernate会自动将用户对应的文章关联上,得到用户文章数
- 结果集.DocList.count;
结果集.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为外键字段生成一个唯一约束。