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. nodejs的get与post

    index.html <html> <body> <form action="/api/v1/records" method="post&q ...

  2. is not mapped 错误改正

    我出现的错误是:oorg.hibernate.hql.ast.QuerySyntaxException: DEPT is not mapped [from DEPT] 配置文件如下: <?xml ...

  3. 车厢调度(train.cpp)

    车厢调度(train.cpp) [问题描述]        有一个火车站,铁路如图所示,每辆火车从A驶入,再从B方向驶出,同时它的车厢可以重新组合.假设从A方向驶来的火车有n节(n<=1000) ...

  4. easyui numberbox输入框 编辑不可编辑的切换

    背景:申请单里需要选费用类型,费用类型有的有子明细项,有个合计项    当有子明细项的时候,合计项的值是通过弹出的子明细项价格的总和(设置为可编辑没问题,因为点击出来弹框,编辑不了)    没有子明细 ...

  5. Windows操作系统----锁住命令行窗口

    第一步: 新建一个.txt文档,输入如下内容: @echo off echo. setlocal :checkpassword set /p password=请输入密码: if "%pas ...

  6. c++实现对输入数组进行快速排序

    #include "stdafx.h" #include <iostream> #include <string> #include <vector& ...

  7. Java Web----Servlet详解

    这篇文章到上一篇,距离的有点遥远呀,隔了大概有两个月把,中间在家过了个年,哈哈~ 现在重新开始拾起,最近在看一本个人觉得很棒的书,<Java Web 整合开发王者归来>,现在写的这一系列基 ...

  8. linux 文件常用操作

    linux 文件基本操作 新建文件:touch test 不会替换重名文件,并且linux一切都是文件,文件夹和文件不能重名 新建文件夹:mkdir test使用 -p 参数,同时创建父目录(如果不存 ...

  9. Linux ->> <user_name> not in the sudoers file. This incident will be reported.

    昨天在用sudo命令执行mkdir命令的时候发生了错误.错误提示如下: hadoop@master:/home$ sudo mkdir /home/hadoop [sudo] password for ...

  10. hashcode方法 简析

    package com.ycgwl; import java.util.HashMap; class People{ private String name; private int age; pub ...