NHbernate自动生成数据库的方法:

using NHibernate;
using NHibernate.Tool.hbm2ddl; namespace Test
{
public class NHDataProvier
{
private readonly ISessionFactory _sessionFactory;
public NHDataProvier()
{
var configuration = new NHibernate.Cfg.Configuration();
configuration.Configure();
_sessionFactory = configuration.BuildSessionFactory();
} public void InitDb()
{
var configuration = new NHibernate.Cfg.Configuration();
configuration.Configure(); new SchemaUpdate(configuration).Execute(true,true); }
}
}

NHDataProvier

NHbernate映射的一些总结:

普通的映射很简单,网上资料也比较多,比较全,我参考的是:http://www.cnblogs.com/GoodHelper/tag/NHibernate/

写的挺不错,大家可以参考一下。

NHbernate中的继承映射:

NHbernate中继承映射的方法常用的有三种:

1.单表继承:即所有父类及子类的字段都放在一个表中,用一个字段来区分子类,但是个人觉得这种方式中是依靠某些特殊的字段是否为空来区别子类的,很多字段的值都会为空,因此不太可取。

2.类表映射:类表映射,故名思议就是一个子类一个表,其子类表通过外键关联到主表。然后一个子类对应一张表。

映射文件如下:

 <?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Model.AnimalModel,Model" table="Animal"> <!--去掉discriminator-value,类表映射这个属性没用了-->
<id name="AnimalId" column="AnimalId" type="Int32">
<generator class="native"/>
</id>
<discriminator column="AnimalType" type="String" />
<property name="Name" column="Name" type="String"/>
<joined-subclass extends="Model.AnimalModel, Model" name="Model.FrogModel, Model" table="Frog"> <!--增加表名-->
<key column="Id"/> <!--添加主键Id-->
<property name="Foot" column="Foot" type="String"/>
</joined-subclass> <!--joined-subclass-->
</class>
</hibernate-mapping>

Animal.hbm.xml

 <?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false">
<joined-subclass extends="Model.AnimalModel, Model" name="Model.FishModel, Model" table="Fish">
<key column="Id"/>
<property name="Tail" column="Tail" type="String"/>
</joined-subclass>
</hibernate-mapping>

Fish.hbm.xml

当然,也可以把Animal.hbm.xml中子类的映射单独写出来而不写在父类的映射中,只需指定extends即可。

3.类表映射使用Discriminator

我在实际使用中用到的就是这种映射方式,Demo如下:

项目的类图如下:

NewsMessage和TextMessage均继承字MessageBase这样一个抽象的父类,父类实现了IMessageBase这样一个接口,方便调用时强转。

映射文件如下:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="YLXY.Weixin.Model"
namespace="YLXY.Weixin.Model.Message" default-lazy="true"> <!--MessageBase映射-->
<class name="MessageBase" table="MessageBase" discriminator-value="Message">
<id name="Id" column="Id" type="Guid">
<generator class="assigned">
</generator>
</id>
<discriminator type="String" column="MsgType"></discriminator>
</class> <!--NewsMessage映射-->
<subclass extends="MessageBase" name="NewsMessage" discriminator-value="News">
<join table="NewsMessage">
<key column="Id"/>
<bag name="Articles">
<key column="ArticleId" not-null="true"/>
<one-to-many class="Article"/>
</bag>
</join>
</subclass> <!--Article映射-->
<class name="Article" table="Article">
<id name="Id" column="Id" type="Guid">
<generator class="assigned">
</generator>
</id>
<property name="Title" column="Title" type="String"></property>
<property name="Description" column="Description" type="String"></property>
<property name="PicUrl" column="PicUrl" type="String"></property>
<property name="Url" column="Url" type="String"></property>
<many-to-one name="NewsMessage" column="NewsMessageId" class="NewsMessage" />
<many-to-one name="UserInfo" class="YLXY.Weixin.Model.Permission.UserInfo,UserInfo"/>
</class> <!--TextMessage映射--> <subclass extends="MessageBase" name="TextMessage" discriminator-value="Text">
<join table="TextMessage">
<key column="Id"/>
<property name="Content" column="Content" type="String"></property>
</join>
</subclass>
</hibernate-mapping>

Message.hbm.xml

业务中一个News中有多个Articles,大家无需关心。

在映射过程中,需要注意的是:

1.在MessageBase实体类中,不需要指定MessageType属性,只需在映射文件中指定就好了。

2.在MessageBase实体的映射文件中,务必指明辨别字段: <discriminator  type="String" column="MsgType"></discriminator>

3.在子类中,务必指明discriminator-value属性,并且各个子类的此属性不能重复,因为ORM最终是根据次属性来判断是哪个子类实体的,从而去不同的表中取对象。

如果在调试过程中报如下错误:

XML validation error: 元素 命名空间“urn:nhibernate-mapping-2.2”中的“class”。 的子元素 命名空间“urn:nhibernate-mapping-2.2”中的“discriminator”。 无效。

则很有可能是<discriminator  type="String" column="MsgType"></discriminator>与其它属性顺序的问题。请务必把辨别字段的映射写在其它所有字段映射的最前面。

先就总结这么多吧,菜鸟初写博客,有不足之处请多多批评指教。

NHibernate学习过程笔记的更多相关文章

  1. NHibernate学习笔记

    原文详见http://www.cnblogs.com/GoodHelper/archive/2011/02/16/nhibernate_03.html   NHibernate_Demo程序框架: D ...

  2. 简单的NHibernate学习笔记

    NHibernate是.NET平台下的ORM框架,与ADO.NET一样实现项目中数据库与项目系统的交互. .首先要用NHibernate框架就要有第三方的dll库来作为支持,附上百度云下载地址:(链接 ...

  3. NHibernate 学习笔记(一)

    NHibernate 的简介: NHibernate是一个面向.NET环境的对象/关系数据库映射工具.对象/关系数据库映射(object/relational mapping (ORM))这个术语表示 ...

  4. NHibernate学习笔记(3)-实体反射到数据库

    一.开发环境 NHiberate版本:4.0.4 开发工具:VS2013 数据库:SQLServer2012 二.开发流程 1.编写领域类与映射文件 namespace Domain { public ...

  5. 《Python编程从入门到实践》--- 学习过程笔记(3)列表

    一.用[](方括号)表示列表,用,(逗号)分隔其中的元素. >>> name=['limei', 'hanmeimei', 'xiaoming'] >>> prin ...

  6. 《Python编程从入门到实践》--- 学习过程笔记(2)变量和简单数据类型

    一.变量无需声明 二.变量命名规则 (1)变量名只能包括字母.数字和下划线: (2)变量名不能包含空格: (3)变量名不能使用Python关键字和函数名(保留字不可以做变量名); (4)简短易懂,清晰 ...

  7. springboot学习过程笔记

    1.spring-boot-devtools热部署在IDEA中配置后不起作用(Eclipse设置了自动编译,所以不用额外设置) 1).pom.xml添加spring-boot-devtools依赖后 ...

  8. Python学习过程笔记整理(四)

    变量作用域 -分类 -全局(global):在函数外部定义:整个全局范围都有效 -局部(local):在函数内部定义:仅在局部范围有效 -提升局部变量为全局变量 -使用global -globals, ...

  9. Python学习过程笔记整理(三)

    函数 -函数使用 -函数需要先定义,定义不会执行函数 -使用函数,俗称调用 -定义函数 -格式:def 函数名称(参数=默认值):,函数名称不能用大驼峰,参数可以没有 -调用函数 -格式:函数名(参数 ...

随机推荐

  1. CentOS 7.2 安装 MySQL 5.6.24

    说明:由于甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此CentOS社区采用mysql的MariaDB分支的方式来避开这个风险. 所以需要先加入yum的仓库,才能利用yum来安装my ...

  2. HttpContext.Current.Request.RawUrl是什么意思?

    原始 URL 定义为 URL 中域信息之后的部分.在 URL 字符串 http://www.contoso.com/articles/recent.aspx 中,原始 URL 为/articles/r ...

  3. maven配置环境

    今天初学maven,先学习一下如何在windows下面配置maven,当然你要先配置好jdk的环境. 第一步,上官网下载maven插件,网址是:点击打开链接 第二步,解压文件夹,放在某一个盘符下,我是 ...

  4. (1-3)line-height与图片的表现

    (1-3)line-height与图片的表现 这篇文章真的很重要,耐心看,重中之重. 一.行高和图片的表现 图片和行高有什么歪腻呢?? 很多人不明白,为什么我图片好好的放在一个标签里面它就出现了如下问 ...

  5. JavaScript中的原型和原型链

    1.原型是什么?原型链是什么? 原型是一个prototype对象,用于表示类型之间的关系: 原型链指的是在JavaScript中对象之间的继承是通过prototype对象指向父类对象,直到指向Obje ...

  6. TreeMap----的实现原理(红黑树)

    TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...

  7. pt-archiver(数据导入导出工具)

    数据导入导出工具pt-archiver 工具可以将MySQL的表数据导出到一个新表或者一个文件,也有自己的应用场景,比如数据归档,删除数据,数据合并等. 具体用法: pt-archiver [OPTI ...

  8. CefSharp开发

    CefSharp是用chromium内核开发的.net版本浏览器工具.目前只支持X86模式.所以在调试的时候要把平台改为X86 CefSharp开发指引:https://ourcodeworld.co ...

  9. Ubuntu中的两种link的区别

    Ubuntu中有两种link(windows世界中文件的“快捷方式”),一个是hard link(硬链接),另一个是symbolic link(软链接). 那么,什么是硬链接,什么又是软链接呢? 硬链 ...

  10. July 09th 2017 Week 28th Sunday

    He that boasts of his own knowledge proclaims ignorance. 夸耀知识实乃无知. Honestly speaking, I don't agree ...