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. 建一个springboot项目

    1.打开 https://start.spring.io/ 新建一个maven的demo,这里选择的是1.5.18的版本 2.将自动生成的demo导入eclipse,直接选中File里的import, ...

  2. servlet开发(二)之servlet的线程安全问题

    之所以考虑线程安全问题,是因为引入了多线程.多线程指的是这个程序(一个进程)运行时产生了不止一个线程.如果不考虑多线程的话,程序执行只有一条路径,就像人在敲代码的时候只能敲代码,不能戴上耳机听歌.引入 ...

  3. C Primer Plus note3

    上面的源代码为什么输入q的时候,程序就会退出呢? while(条件语句),status == 1是条件语句,status只要是非0值的时候,status == 1的条件就满足,程序就会运行while循 ...

  4. JS读取粘贴板内容

    1.1     监听onpaste事件 1.1.1 定义和用法 npaste 事件在用户向元素中粘贴文本时触发. 注意: 虽然使用的 HTML 元素都支持 onpaste 事件,但实际上并非支持所有元 ...

  5. 第2章、数据与简单计算程序(c语言入门)

    一.写程序描述数据的处理 ①描述数据 ②描述过程 ps:和做鸡蛋饼差不多:数据是材料,作法是过程. 空白符的作用是使用程序更容易了解. 二.标识符 1.基本要求: ①由字母,数字,下划线组成. ②数字 ...

  6. CSS属性: 阴影 轮廓 渐变

    注: 本文摘自 宁静致远 - CSDN / 但愿人长久 千里共婵娟 - CSDN 阴影 使用box-shadow属性可以为元素添加阴影效果, 比如 box-shadow: h-shadow v-sha ...

  7. ArcSDE 常用命令

    一.sdeservice命令: 1. 创建sde服务:sdeservice –o create ArcSDE常用操作命令(转): 启动cmd 1. 创建和删除ArcSDE服务操作命令(sdeservi ...

  8. VC学习笔记----STL库

      STL = Standard Template Library,标准模板库,惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Meng Lee和David R Muss ...

  9. vs2010开发activex(MFC)控件/ie插件(一)

    原文:http://blog.csdn.net/yhhyhhyhhyhh/article/details/50782904  vs2010开发activex(MFC)控件:      第一步:生成ac ...

  10. Ubuntu14.04下如何安装Python爬虫框架Scrapy

    按照官方文档的说明,安装scrapy 需要以下程序或者库: (1).Python 2.7 (2).lxml. Most linux distributions ships PRepackaged ve ...