1:数据库脚本,创建两张表T_Area、T_Unit,表示一个单位对应一个地区,在单位表中有个AreaID为T_Area表中的ID;

CREATE TABLE [dbo].[T_Area](
[ID] [int] IDENTITY(1,1) NOT NULL,
[AreaName] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_T_Area] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] CREATE TABLE [dbo].[T_Unit](
[ID] [int] IDENTITY(1,1) NOT NULL,
[UnitName] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[AreaID] [int] NULL,
CONSTRAINT [PK_T_Unit] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

2:实体代码如下:

namespace Wujy.ModelLibrary.Entity
{
public class AreaModel
{
public virtual int Id { get; set; }
public virtual string Areaname { get; set; }
public virtual UnitModel unit { get; set; }
}
} namespace Wujy.ModelLibrary.Entity
{
public class UnitModel
{
public virtual int Id { get; set; }
public virtual string Unitname { get; set; }
public virtual int? Areaid { get; set; }
public virtual AreaModel area { get; set; }
}
}

3:XML映射文件的内容:

3.1 AreaModel.hbm.xml文件内容

<hibernate-mapping assembly="Wujy.ModelLibrary" namespace="Wujy.ModelLibrary.Entity" xmlns="urn:nhibernate-mapping-2.2">
<class name="AreaModel" table="T_Area" lazy="true" >
<id name="Id" column="ID">
<generator class="identity" />
</id>
<property name="Areaname">
<column name="AreaName" sql-type="nvarchar" not-null="false" />
</property>
<one-to-one name="unit" cascade="all"></one-to-one>
</class>
</hibernate-mapping>

3.2 UnitModel.hbm.xml文件内容

<hibernate-mapping assembly="Wujy.ModelLibrary" namespace="Wujy.ModelLibrary.Entity" xmlns="urn:nhibernate-mapping-2.2">
<class name="UnitModel" table="T_Unit" lazy="true" >
<id name="Id" column="ID">
<generator class="identity" />
</id>
<property name="Unitname">
<column name="UnitName" sql-type="nvarchar" not-null="false" />
</property>
<property name="Areaid">
<column name="AreaID" sql-type="int" not-null="false" />
</property>
<one-to-one name="area" cascade="all"></one-to-one>
</class>
</hibernate-mapping>

注意:Cascade:则表示一种级联操作,它的值有none\save-update\delete\all\all-delete-ophan,它主要作用是在父类子类之间进行操作时,哪些操作会对父类(如班级Class类)、子类(Student)有影响。在NHibernate社区,Cascade默认值为none。

4:主要代码如下,其它DAL层的代码可以见文章后面的源代码下载,其中Button3_Click中的代码里面有获得model.area.Areaname  areamodel.unit.Unitname;

        protected void Button1_Click(object sender, EventArgs e)
{
AreaModel model = new AreaModel();
model.Areaname = "厦门";
AreaBll.Add(model);
Response.Write("成功");
} protected void Button2_Click(object sender, EventArgs e)
{
UnitModel model = new UnitModel();
model.Unitname = "软件园";
model.Areaid = 1;
UnitBll.Add(model);
Response.Write("成功");
} protected void Button3_Click(object sender, EventArgs e)
{
UnitModel model = UnitBll.findById(1);
Response.Write(model.area.Areaname + "|" + model.Areaid + "|" + model.Unitname); AreaModel areamodel = AreaBll.findById(1);
Response.Write("<br/>"+areamodel.unit.Unitname);
} protected void Button4_Click(object sender, EventArgs e)
{
UnitModel model = UnitBll.findById(1);
UnitBll.Remove(model);
Response.Write("成功");
}

效果图:

5:删除后的效果图,由于XML映衬文件设置cascade="all",都同样把数据库中两张表都删除:

            UnitModel model = UnitBll.findById(1);
UnitBll.Remove(model);
Response.Write("成功"); 或 AreaModel model = AreaBll.findById(1);
AreaBll.Remove(model);
Response.Write("成功");

6:one-to-one的XML属性说明:

<one-to-one
name="PropertyName"
class="ClassName"
cascade="all|none|save-update|delete"
constrained="true|false"
fetch="join|select"
property-ref="PropertyNameFromAssociatedClass"
access="field|property|nosetter|ClassName"
/> (1) name: 属性的名字。
(2) class (可选 - 默认是通过反射得到的属性类型):被关联的类的名字。
(3) cascade(级联) (可选) 表明操作是否从父对象级联到被关联的对象。
(4) constrained(约束) (可选) 表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。 这个选项影响Save()
和Delete()在级联执行时的先后顺序以及 决定该关联能否被委托(也在schema export tool中被使用).
(5) fetch (可选 - 默认设置为select): 在外连接抓取或者序列选择抓取选择其一.
(6) property-ref: (可选) 指定关联类的属性名,这个属性将会和本类的主键相对应。如果没有指定,会使用对方关联类的主键。
(7) access (可选 - 默认是 property): NHibernate用来访问属性的策略。

感谢您的阅读,坚持每天进步一点点,离成功就更新一步;希望文章对您有所帮助;源代码下载

转载至:http://www.cnblogs.com/wujy/p/3602200.html

NHibernate初学四之关联一对一关系的更多相关文章

  1. NHibernate初学五之关联一对多关系

    1:创建两张表T_Country.T_Person:其中T_Person表中有一个CountryID对应T_Country的ID,一个Country可以对应多个Person CREATE TABLE ...

  2. NHibernate初学六之关联多对多关系

    1:创建三张表T_Course.T_Student.T_Middle:其中一个学生可以对应多个课程,一个课程也可以对应多个学生,用T_Middle存放它们的关系内容: CREATE TABLE [db ...

  3. Entity Framework - 理清关系 - 基于外键关联的单向一对一关系

      注:本文针对的是 Entity Framework Code First 场景. 之前写过三篇文章试图理清Entity Framework中的一对一关系(单相思(单向一对一), 两情相悦(双向一对 ...

  4. Hibernate 、多表关联映射 - 一对一关系映射(one- to-one)

    hibernate.cfg.xml: <hibernate-configuration> <session-factory name="sessionFactory&quo ...

  5. Entity Framework - 基于外键关联的单向一对一关系

    代码的世界,原以为世界关系很简单,确道是关系无处不在.NET世界里ORM框架中EntityFramework作为其中翘楚,大大解放了搬砖工作的重复工作,着实提高了不少生产力,而也碰到过不少问题!比如关 ...

  6. hibernate 关系映射之 单向外键关联一对一

    这里的关系指的是对象与对象之间的关系 注解方式单向关联一对一: //这个类描述的husband是一个对应一个wife的 import javax.persistence.Entity; import ...

  7. 0049 MyBatis关联映射--一对一关系

    世上的事务总不是孤立存在的,表现在Java类里面,则是类与类之间的关系,比如继承is-a.依赖use-a.关联has-a,反映在数据库中,则是表与表之间的关系,比如外键 关联关系存在着以下几种类型:一 ...

  8. hibernate(五) hibernate一对一关系映射详解

    序言 之前讲解了一对多(单向.双向).多对多(双向),今天就讲解一下最后一个关系,一对一. 心情不错.状态也挺好的,赶紧写一篇博文造福一下大家把. --WH 一.一对一关系的概述 一对一关系看起来简单 ...

  9. Hibernate学习(五)———— hibernate一对一关系映射详解

    一.一对一关系的概述 一对一关系看起来简单,其实也挺复杂的.其中关系就包含了四种,单向双向和主键关联外键关联. 什么意思呢,也就是包含了单向一对一主键关联.双向一对一主键关联,单向一对一外键关联,双向 ...

随机推荐

  1. maven(1)------使用myeclipse构建maven项目

    maven官网:http://maven.apache.org/ 依据官网的说法,Maven是一个采用纯Java编写的开源项目管理工具,基于一个称为项目对象模型(POM)的概念,可以管理项目的生命周期 ...

  2. python学习之base64模块

    常见方法: base64.encodebytes() 参数: 接收一个字节对象. 返回值: 返回base64编码的数据(以'\n'结尾的数据). base64.decodebytes() 参数: 接收 ...

  3. ny236 心急的C小加 hdoj1051 Wooden Sticks

    心急的C小加 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间 ...

  4. 随笔记:Python于Windows下初实践,及使用Connector/Python连接MySQL

    有一同事要离职了,我负责交接一个用Python同步数据的项目. 之前木有做过Python,周休,做个简单的查询数据库,小练一下手. 包含: 安装 连接.查询MySQL 列表 元组 for循环 whil ...

  5. document对象和属性

    文档对象:整个Html都属于document,他封装了大量的功能: docum的属性: document.title //设置文档标题等价于HTML的<title>标签 document. ...

  6. [已修正]安装struts找不到tld文件

    今天安装的struts1.3,但是缺少tld文件,所以无法使用taglib,找了半天 假设你的struts版本为1.3.10 解压后的目录为F:\struts-1.3.10-all\struts-1. ...

  7. 【Unity笔记】常见集合类System.Collections

    ArrayList:长度可变数组,不限定类型 ArrayList al = new ArrayList(); ↓ List:替代ArrayList,限定类型 List list = new List& ...

  8. pku oj overhang叠加卡片求最少的卡片数

    这个估计是里面第二简单的了,因为第一简单的是求a+b 哈哈,一submit就ac了 题目如下: Description How far can you make a stack of cards ov ...

  9. datagrid中reoload提交时如何批量提交表单中的查询条件

    看标题描述有点复杂,看下图: 直接将手工添加的一个个字段直接用一句代码完成. $('#dg_sub').datagrid("reload",$('#searchForm').ser ...

  10. 一、VM8.0 + CentOS 6.5 连接网络

    VM8.0 + CentOS 6.5 连接网络