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;
}
}
}
运行后如下图:
我们想一下,在数据库中,多对一的情况,即是外建和主键的关系,这种情况是很常见的,那如何在 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多对一 关的概念介绍
我们先看一张图片:
![](https://i-blog.csdnimg.cn/blog_migrate/f5dd33c82d11d3522b1a8f84c0ebe2e2.jpeg)
本图中:学生表有两条记录,它们分别对应了班级表的主键值为“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,从中追寻更多的知识面。