C#数据操作系列-12 NHibernate的增删改查

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 的说明

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)

/>

schema: 数据库schema的名称

default-cascade:可选项,默认是none,一种默认的级联风格

auto-import:明确是否可以在查询中使用非限定类名。

assembly:指定映射对象所在的assembly,一般情况指的是项目名称

namespace:所在命名空间

default-access:可选的,默认是property,表示NHibernate的读取数据列的策略,默认情况从Property 中读取

default-lazy:可选的,默认是true,是否启动延迟加载

1.2 class的配置

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

1.2.1 id

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

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

name="PropertyName"

type="typename"

column="column_name">

name : 对应的属性名

type:对应的NHibernate类型

column:列名

generator:主键生成器,如果不需要参数可以直接在 id节点处添加,最常用的是native。

1.2.2 property

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

name="propertyName"

column="column_name"

type="typename"

/>

name :类里的属性名

column:对应数据表的列名

type:数据库中的类型

1.2.3 many-to-one

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

name="PropertyInOne"

class="ManyClass"

column="Column"

>

1.2.4 one-to-one

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

示例如下:

2. 增删改查

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

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

public class Repository 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 IqQueryable()

{

return Session.Query();

}

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

3. 总结

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

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200522A0611700?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券