首页 快讯正文

云博开户:C# 数据操作系列 - 12 NHibernate的增删改查

admin 快讯 2020-05-22 4 0

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

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

,

sunbet

www.0-577.com欢迎您的加入。

版权声明

本文仅代表作者观点,
不代表本站诚信在线的立场。
本文系作者授权发表,未经许可,不得转载。