您的位置:首页 > 其它

NHibernate多对一xml映射-NHibernate入门到精通系列7

2012-09-06 09:00 549 查看
NHibernate开发中的NHibernate多对一xml映射,和数据库开发是相离不开的,只是中间多了一层Xml映射。

我们想一下,在数据库中,多对一的情况,即是外建和主键的关系,这种情况是很常见的,那如何在NHibernate中来表示多对一的关系呢?

继上节实体与数据库的Xml映射标签-NHibernate入门到精通系列6的内容,我们来看一下如何实现多对一的Xml映射:

一、NHibernate多对一关联映配置

<many-to-one

name="PropertyName" 实体属性名

column="column_name" 数据库字段名

class="ClassName" NHibernate关联的类名

cascade="all|none|save-update|delete" 级联关系

fetch="join|select" 批次读取

update="true|false" 启用更新

insert="true|false" 启用插入

property-ref="PropertyNameFromAssociatedClass" 指定关联类的一个属性,这个属性将会和本外键相对应

access="field|property|nosetter|ClassName"

unique="true|false" 启用生成唯一约束

optimistic-lock="true|false"

not-found="ignore|exception" 数据不存在,忽略还是抛异常。

  />

二:NHibernate多对一关的概念介绍

我们先看一张图片:



本图中:学生表有两条记录,它们分别对应了班级表的主键值为“1”的同一条记录。

所以这就是“多对一”的使用情景。

三:NHibernate多对一关联映射插入和查询示例

先来段示例代码:

public void Save()

{

using (ISession session = this.sessionFactory.OpenSession())

{

var cls = new Class { Name = "2班" };

var liu = new Student { Name = "小冬", Class = cls };

var zhang = new Student { Name = "小三", Class = cls };

ITransaction tran = session.BeginTransaction();

try

{

//持久化“Class”类

session.Save(cls);

session.Save(liu);

session.Save(zhang);

tran.Commit();

}

catch(Exception ex)

{

tran.Rollback();

throw ex;

}

}

}

运行后如下图:



这里提示一下:
如果发现抛出“object references an unsaved transient instance - save the transient instance before flushing. Type: Domain.Class, Entity: Domain.Class”这样的异常。

原因可能是:持久化Student类的实例后,Student类的实例变为持久态(Persistent),而Class类的实例还是临时态(Transient),当持久化一个持久态的实例时,若该实例引用了一个临时态的实例,就会抛出这样的异常。

本节简单介绍到这里,免的介绍的太复杂,大伙学习起来看似头痛,如想学习更复杂的操作,也可以相关百度google,从中追寻更多的知识面。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: