0. 前言

上一篇《C# 数据操作系列 - 11 NHibernate 配置和结构介绍》 介绍了Nhibernate里的配置内容。这一篇将带领大家了解一下如何使用NHIbernate。之前提到NHibernate继承了Hibernate的一些传统:使用XML文件进行配置,这一点也是备受争议。不过,有社区爱好者开发了一个名为《Fluent NHibernate》的项目,用来支持NHibernate的流式配置。当然,NHibernate本身也提供了NHibernate.Mapping.ByCode模式。不过这一篇暂且略过,留待下文。

1. NHibernate映射文件

对于NHibernate的映射文件有个约定的名字:

<类名>.hbm.xml

这里先为大家介绍一下映射文件的格式:

1.1 hibernate-mapping 的说明

<hibernate-mapping
schema="schemaName" (1)
default-cascade="none|save-update" (2)
auto-import="true|false" (3)
assembly="Eg" (4)
namespace="Eg" (5)
default-access="field|property|field.camecase..." (6)
default-lazy="true|false" (7)
/>
  1. schema: 数据库schema的名称
  2. default-cascade:可选项,默认是none,一种默认的级联风格
  3. auto-import:明确是否可以在查询中使用非限定类名。
  4. assembly:指定映射对象所在的assembly,一般情况指的是项目名称
  5. namespace:所在命名空间
  6. default-access:可选的,默认是property,表示NHibernate的读取数据列的策略,默认情况从Property 中读取
  7. default-lazy:可选的,默认是true,是否启动延迟加载

1.2 class的配置

一般情况下,class节点只需要指定name和table就可以了。接下来,让我们探索class如何映射成的。

1.2.1 id

任何一个映射都必须声明一个数据表的主键,大多数类也必须有一个唯一标示字段用来区分不同的实例。

这里介绍一下 id 节点的配置:

<id
name="PropertyName"
type="typename"
column="column_name">
<generator class="generatorClass"/>
</id>
  • name : 对应的属性名
  • type:对应的NHibernate类型
  • column:列名
  • generator:主键生成器,如果不需要参数可以直接在 id节点处添加,最常用的是native。

1.2.2 property

映射一个普通属性就简单多了,只需要进行以下配置即可:

<property
name="propertyName"
column="column_name"
type="typename"
/>
  • name :类里的属性名
  • column:对应数据表的列名
  • type:数据库中的类型

1.2.3 many-to-one

在Nhibernate中,多对一的配置是在一的一端,表示该类有一个外键导航。

<many-to-one
name="PropertyInOne"
class="ManyClass"
column="Column"
></many-to-one>

1.2.4 one-to-one

一对一的关系与多对一的关系比较相似,不同的地方在于一对一需要在双方的映射关系里均要维护,在有外键的表/实体中 添加 constrained=“true”。

示例如下:

<one-to-one name="Person" class="Person"/>
<one-to-one name="Employee" class="Employee" constrained="true"/>

2. 增删改查

Nhibernate的每次操作都基于一个Session,所以我们在操作数据库的时候最好先持有一个可用的Session。接下来,我们就一个通用数据库操作类为基础,向大家分享一下我的想法。

首先,创建一个泛型模板类,并约束泛型为类:

public class Repository<T> where T: class
{ }

添加一个ISession属性,用来后续访问操作,并由构造方法赋值:

public Repository(ISession session)
{
Session = session;
} public ISession Session { get; }

2.1 新增

现在我们写一下新增方法:

public object Add(T entity)
{
var key= Session.Save(entity);
return key;
} public void Add(params T[] entities)
{
foreach (var entity in entities)
{
Session.Save(entity);
}
}

查了下,Save会返回当前持久化对象插入时生成的主键。

2.2 修改

NHibernate的修改与EF类似,也是由ISession监控了修改,不用做过多的操作。

2.3 删除

NHibernate的删除也十分简单,直接通知ISession删除某个持久化对象。

public void Delete(T entity)
{
Session.Delete(entity);
}
public void Delete(params T[] entities)
{
foreach (var entity in entities)
{
Session.Delete(entity);
}
}

2.4 查询

通常情况下,查询需要结合实际业务来进行开发,当然为了通用,我在这里选择给调用方开放一个查询对象:

public IQueryable<T> IqQueryable()
{
return Session.Query<T>();
}

其中 IQueryable是一个接口,表示这是一个可查询对象,通过Linq可以快捷的查询。

3. 总结

嗯,NHibernate基础使用篇到这里可以暂告一段落了。后续的内容有机会再深挖,当然并不代表EF Core就没有了。嗯嗯,没毛病。下一篇就让我来先替大伙看看SugarSQL是什么情况吧。

不过在本篇内容完结之前,先补充一个NHibernate的SqlDialect选值:

数据库 Dialect 备注
DB2 NHibernate.Dialect.DB2Dialect
DB2 for iSeries(OS/400) NHibernate.Dialect.DB2400Dialect
Firebird NHibernate.Dialect.FirebirdDialect 需要设置driver_class为NHibernate.Driver.FirebirdClientDriver
Informix NHibernate.Dialect.InformixDialect
Informix 9.40 NHibernate.Dialect.InformixDialect0940
Informix 10.00 NHibernate.Dialect.InformixDialect1000
Ingres NHibernate.Dialect.IngresDialect
Ingres 9 NHibernate.Dialect.Ingres9Dialect
Microsoft SQL Server 7 NHibernate.Dialect.MsSql7Dialect
Microsoft SQL Server 2000 NHibernate.Dialect.MsSql2000Dialect
Microsoft SQL Server 2005 NHibernate.Dialect.MsSql2005Dialect
Microsoft SQL Server 2008 NHibernate.Dialect.MsSql2008Dialect
Microsoft SQL Azure Server 2008 NHibernate.Dialect.MsSqlAzure2008Dialect
Microsoft SQL Server 2012 Hibernate.Dialect.MsSql2012Dialect
Microsoft SQL Server Compact Edition NHibernate.Dialect.MsSqlCeDialect
Microsoft SQL Server Compact Edition 4.0 NHibernate.Dialect.MsSqlCe40Dialect
MySQL 3 or 4 NHibernate.Dialect.MySQLDialect
MySQL 5 NHibernate.Dialect.MySQL5Dialect
MySQL 5 InnoDB NHibernate.Dialect.MySQL5InnoDBDialect
MySQL 5.5 NHibernate.Dialect.MySQL55Dialect
MySQL 5.5 Inno DB NHibernate.Dialect.MySQL55InnoDBDialect
Oracle NHibernate.Dialect.Oracle8iDialect
Oracle 9i NHibernate.Dialect.Oracle9iDialect
Oracle 10g, Oracle 11g NHibernate.Dialect.Oracle10gDialect
Oracle 12c NHibernate.Dialect.Oracle12cDialect
PostgreSQL NHibernate.Dialect.PostgreSQLDialect
PostgreSQL 8.1 NHibernate.Dialect.PostgreSQL81Dialect 支持8.1 的 FOR UPDATE NOWAIT
PostgreSQL 8.2 NHibernate.Dialect.PostgreSQL82Dialect 在DROP TABLE和DROP SEQUENCE 语句中支持 IF EXISTS关键字
PostgreSQL 8.3 NHibernate.Dialect.PostgreSQL83Dialect 支持XML类型
SQLite NHibernate.Dialect.SQLiteDialect 设置driver_class为NHibernate.Driver.SQLite20Driver
Sybase Adaptive Server Anywhere 9 NHibernate.Dialect.SybaseASA9Dialect
Sybase Adaptive Server Enterprise 15 NHibernate.Dialect.SybaseASE15Dialect
Sybase SQL Anywhere 10 NHibernate.Dialect.SybaseSQLAnywhere10Dialect
Sybase SQL Anywhere 11 NHibernate.Dialect.SybaseSQLAnywhere11Dialect
Sybase SQL Anywhere 12 NHibernate.Dialect.SybaseSQLAnywhere12Dialect

更多内容烦请关注我的博客《高先生小屋》

C# 数据操作系列 - 12 NHibernate的增删改查的更多相关文章

  1. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(一)

    前言:出于某种原因,需要学习下Knockout.js,这个组件很早前听说过,但一直没尝试使用,这两天学习了下,觉得它真心不错,双向绑定的机制简直太爽了.今天打算结合bootstrapTable和Kno ...

  2. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(三):两个Viewmodel搞定增删改查

    前言:之前博主分享过knockoutJS和BootstrapTable的一些基础用法,都是写基础应用,根本谈不上封装,仅仅是避免了html控件的取值和赋值,远远没有将MVVM的精妙展现出来.最近项目打 ...

  3. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(二)

    前言:上篇 JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(一) 介绍了下knockout.js的一些基础用法,由于篇幅的关系,所以只能分成两篇,望见谅!昨天就 ...

  4. 第三百零七节,Django框架,models.py模块,数据库操作——表类容的增删改查

    Django框架,models.py模块,数据库操作——表类容的增删改查 增加数据 create()方法,增加数据 save()方法,写入数据 第一种方式 表类名称(字段=值) 需要save()方法, ...

  5. 五 Django框架,models.py模块,数据库操作——表类容的增删改查

    Django框架,models.py模块,数据库操作——表类容的增删改查 增加数据 create()方法,增加数据 save()方法,写入数据 第一种方式 表类名称(字段=值) 需要save()方法, ...

  6. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(四):自定义T4模板快速生成页面

    前言:上篇介绍了下ko增删改查的封装,确实节省了大量的js代码.博主是一个喜欢偷懒的人,总觉得这些基础的增删改查效果能不能通过一个什么工具直接生成页面效果,啥代码都不用写了,那该多爽.于是研究了下T4 ...

  7. MVC3+EF4.1学习系列(二)-------基础的增删改查和持久对象的生命周期变化

    上篇文章中 我们已经创建了EF4.1基于code first的例子  有了数据库 并初始化了一些数据  今天这里写基础的增删改查和持久对象的生命周期变化 学习下原文先把运行好的原图贴来上~~ 一.创建 ...

  8. 第二百七十七节,MySQL数据库-数据表、以及列的增删改查

    MySQL数据库-数据表.以及列的增删改查 1.创建一个表 CREATE(创建) TABLE(表) ENGINE(引擎) ENGINE=INNODB(引擎)还有很多类引擎,这里只是简单的提一下INNO ...

  9. C# 数据操作系列 - 10 NHibernate初试

    0. 前言 在上一篇基本讲完了EF Core的入门级教程.从这一篇开始,我们试着去探索一下 .net core平台上更多的ORM框架.那么,这一篇开始我们就来试试NHibernate. 1. NHib ...

随机推荐

  1. Add text to 'Ready Page' in Inno Setup

    https://stackoverflow.com/questions/1218411/add-text-to-ready-page-in-inno-setup

  2. 消息中间件之zookper安装部署

    消息中间件之zookper安装部署jdk可以在官网或者网上下载[root@q tools]# chmod 755 jdk-8u40-linux-x64.rpm [root@q tools]# rpm ...

  3. Elasticsearch系列---实现分布式锁

    概要 Elasticsearch在文档更新时默认使用的是乐观锁方案,而Elasticsearch利用文档的一些create限制条件,也能达到悲观锁的效果,我们一起来看一看. 乐观锁与悲观锁 乐观锁 E ...

  4. Kubernetes 命令行工具之kubctl

    目录 1.何为kubectl 2.Kubectl基本使用 2.1.命令补全 2.2.快速查找资源 2.3.使用自定义输出格式 3.陈述式管理资源 3.1.管理namespace资源 3.2.管理Dep ...

  5. 【集群实战】fatab开机挂载失败案例

    1. nfs挂载加入fstab案例 NFS客户端实现fstab开机自启动挂载 现象:nfs开机挂载卸载了/etc/fstab中,结果无法开机自动挂载nfs 解答:1. nfs客户端命令放在/etc/r ...

  6. JS编程建议——11:慎重使用伪数组

    建议11:慎重使用伪数组JavaScript没有真正的数组,因此typeof运算符不能辨别数组和对象.伪数组在JavaScript中有很高的易用性,程序员不用给它设置维度,而且永远不用担心产生越界错误 ...

  7. 数学--数论-- HDU 2601 An easy problem(约束和)

    Problem Description When Teddy was a child , he was always thinking about some simple math problems ...

  8. TCP的三次握手四次挥手理解及面试题

    一.TCP概述 每一条TCP连接都有两个端点,这种端点我们叫作套接字(socket),它的定义为端口号拼接到IP地址即构成了套接字, 例如,若IP地址为192.0.0.1 而端口号为8000,那么得到 ...

  9. Spring官网阅读(七)容器的扩展点(二)FactoryBean

    在上篇文章中我们已经对容器的第一个扩展点(BeanFactoryPostProcessor)做了一系列的介绍.其中主要介绍了Spring容器中BeanFactoryPostProcessor的执行流程 ...

  10. 201771030115-牛莉梅 实验一 软件工程准备-<初学《构建之法--现代软件工程》的疑问>

    项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/nwnu2020SE 这个作业要求链接 https://www.cnblogs.com/nwnu- ...