上一篇主要介绍了NHibernate映射文件的基础配置,这篇我们介绍下NHibernate的一对多及多对一配置(文中我直接使用双向关联,即一和多两端都配置,开发中可以只使用一端),同时略带介绍下NHibernate.Mapping.Attributes方式配置表映射。

首先,我们使用Parent和Children两个类,Parent为一端,Chrildren为多端。

下面是Parent类和映射文件配置:

namespace NHibernateStudy.OneToMany
{
public class Parent
{
public virtual String Id { get; set; } public virtual String Name { get; set; } public virtual IList<Children> Children { get; set; }
}
}
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateStudy" namespace="NHibernateStudy.OneToMany">
<class name="Parent" table="parents">
<id name="Id" column="id" type="String">
<generator class="uuid.hex" />
</id>
<property name="Name" column="name" type="String" />
<bag name="Children" table="children" inverse="true" cascade="all">
<key column="parentid" />
<one-to-many class="NHibernateStudy.OneToMany.Children"/>
</bag>
</class>
</hibernate-mapping>

其中cascade我配置了all,保证级联更新,若有其他需求可以使用none等值。

下面是Children类及配置文件:

namespace NHibernateStudy.OneToMany
{
public class Children
{
public virtual string Id { get; set; } public virtual string Name { get; set; } public virtual Parent TheParent { get; set; }
}
}
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateStudy" namespace="NHibernateStudy.OneToMany">
<class name="Children" table="children">
<id name="Id" column="id" type="String">
<generator class="uuid.hex" />
</id>
<property name="Name" column="name" type="String" />
<many-to-one name="TheParent" column="parentid" class="NHibernateStudy.OneToMany.Parent" />
</class>
</hibernate-mapping>

其中需要注意,many-to-one中,column写的是当前表的字段——外键;而配置一端时,其中key里的column配置的是多端的字段,即子表里的外键,而非当期表字段。

配置文件中添加mapping:

<mapping resource="NHibernateStudy.OneToMany.Parent.hbm.xml" assembly="NHibernateStudy" />
<mapping resource="NHibernateStudy.OneToMany.Children.hbm.xml" assembly="NHibernateStudy" />

下面是使用方式过程:

#region 添加一对多关联数据
Parent parent = new Parent();
parent.Name = "parent" + DateTime.Now.ToString("MMddHHmmss");
parent.Children = new List<Children>();
Children child = new Children();
child.Name = "child" + DateTime.Now.ToString("MMddHHmmss");
child.TheParent = parent;
parent.Children.Clear();
parent.Children.Add(child);
session.Save(parent);
session.BeginTransaction().Commit();
#endregion #region 查看多对一数据
IList<Children> children = session.CreateCriteria<Children>().List<Children>();
foreach (var item in children)
{
Parent itemparent = item.TheParent ?? new Parent();
Console.WriteLine(string.Format("ChildId:{0} Name:{1} \r\nParentId:{2} ParentName:{3}", item.Id, item.Name, itemparent.Id, itemparent.Name));
}
#endregion

下面介绍下Attributes方式配置映射文件。

首先添加NHibernate.Mapping.Attributes引用,可以在nuget中查找。

下面是配置的类,使用此法可以避免使用hbm.xml的繁琐,其中的属性与hbm.xml中的基本一致。

namespace NHibernateStudy
{
[Serializable]
[Class(Table = "animals", Name = "NHibernateStudy.Animal,NHibernateStudy")]
public class Animal
{
/// <summary>
/// 主键
/// </summary>
[Id(Name = "Id", Column = "id", TypeType = typeof(string))]
[Key]
[Generator(Class = "uuid.hex")]
public virtual String Id { get; set; } [Property(Name = "Name", Column = "name")]
public virtual string Name { get; set; } }
}

不过需要注意的是,在代码中使用的时候,需要使用以下方式加载Mapping。

Configuration cfg = new Configuration();

MemoryStream stream = new MemoryStream();
NHibernate.Mapping.Attributes.HbmSerializer.Default.Validate = true;
NHibernate.Mapping.Attributes.HbmSerializer.Default.Serialize(
stream, System.Reflection.Assembly.GetExecutingAssembly());
stream.Position = 0; // Rewind
cfg.Configure();
cfg.AddInputStream(stream); // Use the stream here
stream.Close(); ISessionFactory sessionFactory =cfg.BuildSessionFactory();
ISession session = sessionFactory.OpenSession();

下面是具体使用过程:

#region NHibernate.Mapping.Attributes映射添加一条数据
Animal a = new Animal();
a.Name = "animal" + DateTime.Now.ToString("MMddHHmmss");
session.Save(a);
session.BeginTransaction().Commit(); IList<Animal> an = session.CreateCriteria<Animal>().List<Animal>();
foreach (var item in an)
{
Console.WriteLine("Animal——ID: " + item.Id + " Name:" + item.Name);
}
#endregion

咱就入个门之NHibernate映射文件配置(二)的更多相关文章

  1. 咱就入个门之NHibernate映射文件配置(一)

    之前写了数据库连接配置,这次说说映射文件的配置,即表映射[ORM的核心就是此啦!]. 下面我们使用最原始的手动配置hbm.xml文件. 步骤: 1.添加People类 namespace NHiber ...

  2. 用MyGeneration模板生成NHibernate映射文件和关系

    用我的MyGeneration模板生成NHibernate映射文件和关系(one-to-one,one-to-many,many-to-many) MyGeneration的几个NHibernate模 ...

  3. NHibernate之映射文件配置说

    1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表名会加上所指定的schema的名字扩展为 ...

  4. 深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap

    上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select ...

  5. 深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap good

    上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select ...

  6. 深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap[转]

    上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select ...

  7. 深入浅出Mybatis系列八-mapper映射文件配置之select、resultMap

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之inse ...

  8. MyGeneration模板生成NHibernate映射文件和关系(one-to-one,one-to-many,many-to-many)

    MyGeneration的几个NHibernate模板功能已经很强,但还是存在些问题.例如:Guid主键支持不佳,代码不易修改,不支持中文注释等等.所以我决定自己来改写此模版.我把一部分通用的函数提取 ...

  9. Hibernate的映射文件配置

    对象关系的映射是用一个XML文档来说明的.映射文档可以使用工具来生成,如XDoclet,Middlegen和AndroMDA等.下面从一个映射的例子开始讲解映射元素,映射文件的代码如下: <?x ...

随机推荐

  1. Random Pick Index

    Given an array of integers with possible duplicates, randomly output the index of a given target num ...

  2. 7.31 签到,js 全局预处理笔记

    js 解析与执行过程: 一.全局:  1.预处理阶段 : 1.LexicalEnviroment === window {1.预处理 var   |   2.function xxx //预处理申明的 ...

  3. hiho一下第一周 最长回文子串

    题目链接:http://hihocoder.com/contest/hiho1/problem/1 #include <iostream> #include <cstdio> ...

  4. linux 卸载软件

    sudo apt-get autoremove --purge 后跟要卸载的软件名称, --purge表示要完全卸载.

  5. rsync实现同步

    一.备份客户端: 1.创建/etc/rsyncd.secrets 权限配置600 (写服务器端的账户密码) 2.客户端配置文件: port=873log file=/var/log/rsync.log ...

  6. php继承、多态

    继承: 概念:子类可以继承父类的一切 特点:单继承:一个子类只能有一个父类,一个父类可以派生出多个子类 方法重写:在子类里面对父类的方法进行重写. 重写:override 重载,编译多态:overlo ...

  7. mysql常用函数整理

    一.数学函数 数学函数主要用于处理数字,包括整型.浮点数等. ABS(x) 返回x的绝对值 ) -- 返回1 CEIL(x),CEILING(x) 返回大于或等于x的最小整数 SELECT CEIL( ...

  8. [Android Pro] android 4.4 Android原生权限管理:AppOps

    reference : http://m.blog.csdn.net/blog/langzxz/45308199 reference : http://blog.csdn.net/hyhyl1990/ ...

  9. September 10th 2016 Week 37th Saturday

    An innovation that goes beyond imagination again raised the standard. 颠覆想象的创新,再一次刷新标准. An advertisem ...

  10. 群内大神与你交流WEB经验 业内专家指点就职技巧

    就知道你是一个有理想要抱负的人,不会满足于做一个初级的前端开发工程师.在接下来的这个阶段,我们将走上前端开发的进阶之路,将自己的能力再往上拔高一个等级.同样,薪资也会往上升一个等级!但是,如果你是一个 ...