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. HDU 1561 The more, The Better 经典树形DP

    The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  2. docker 容器启动并自启动redis

    centos7.5 背景:每次开机后都要自动启动redis,也就是宿主机开机,启动容器,然后启动redis 按照网上的做法是:修改redis.conf ,修改redis的启动脚本(utils/...s ...

  3. [翻译]Review——The Inner Workings Of Virtual DOM

    The Inner Workings Of Virtual DOM 虚拟DOM的内部工作机制 原文地址:https://medium.com/@rajaraodv/the-inner-workings ...

  4. 【转】JSON.parse()与JSON.stringify()的区别

    JSON.parse()[从一个字符串中解析出json对象] 例子: //定义一个字符串 var data='{"name":"goatling"}' //解析 ...

  5. Can't read stdin: end of file found

    问题是在我修改svn的账号和密码后出现的,因为百度出来的情况只有一种答案,所以记录一下我的情况,给其他人多一种排查思路.问题根源是,由于该版本库只有一个账号,更改了账号密码,没有同步修改post-co ...

  6. 在Datagridview中添加datagridviewComboBox列并显示下拉列表

    在DataGridView中自动的添加Column. private void button_autoAddColumn_Click(object sender, EventArgs e) { try ...

  7. Python pymysql模块学习心得

    PyMySQL包含了一个纯Python的MySQL客户端的库,它的目的是用来替换MySQLdb,并且工作在CPython,PyPy和IronPython. PyMySQL官方地址:https://py ...

  8. 使用 Azure CLI 将 IaaS 资源从经典部署模型迁移到 Azure Resource Manager 部署模型

    以下步骤演示如何使用 Azure 命令行接口 (CLI) 命令将基础结构即服务 (IaaS) 资源从经典部署模型迁移到 Azure Resource Manager 部署模型. 本文中的操作需要 Az ...

  9. javaEE版本的eclipse中导入工程,发现server里面找不到工程,根本发布不了也不能运行

    原文:http://www.cnblogs.com/sxmcACM/p/3674545.html 1.具体解决方法 首先确保,你导入的工程所用的JDK版本和你的机器上安装的版本是同一版本, 如果不同做 ...

  10. git常用命令#自用#

    =====  未完结,慢慢补充 =====   零.克隆 1.克隆主分支 : git clone ${remotePath} 2.克隆指定分支 : git clone -b <branch na ...