• C# 数据操作系列


    0. 前言

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

    1. NHibernate 介绍

    NHibernate是Hibernate的C#版,众所周知Hibernate是Java 里ORM的顶梁柱(至少曾经)。Hibernate可以说开拓了Java的世界,当年SSH三驾马车风靡世界,至今Hibernate都发挥着举足轻重的作用。

    不过,与EntityFramework不同的地方是,Hibernate以配置文件为主,通过配置文件规范使用,Object/Relation 映射。而NHibernate这继承了这一点,也是以配置文件优先。下图是 NHibernate的工作原理:

    img

    通过读取App.config或者Web.config文件去读NHibernate的基本配置,然后加载映射文件,建立映射关系。在后续使用中,通过映射关系生成SQL语句(这一步跟EF是一致的),进而操作数据或者查询数据。

    2. 初探 NHibernate

    2.1 准备

    先来个控制台项目,我起名为dataprovider。然后安装NHibernate:

    1. NuGet:
    Install-Package NHibernate
    
    1. dotnet core 命令行:
    dotnet add package NHibernate
    

    这个文章中使用的NHibernate版本是 5.2.7

    2.2 配置

    需要创建一个项目用的配置文件:App.config.

    C# 项目中,除了Web类型的项目,每个项目的主配置文件的名称都是App.config,这是一个固定名称。

    文件内容如下:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    </configuration>
    

    在 configuration节点之间添加以下内容:

    <configSections>
        <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/>
      </configSections>
    

    这段代码的含义是,在config文件中添加一个 hibernate-configuration结点,结点的解析由类:NHibernate.Cfg.ConfigurationSectionHandler,所在包是NHibernate。

    在App.config文件configuration结点中添加以下代码:

    <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
        <session-factory>
            <property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>
            <property name="connection.connection_string">
                Data Source=.;Initial Catalog=Demo;Integrated Security=True
            </property>
            <property name="hbm2ddl.auto">create-drop</property>
            <mapping assembly="dataprovider" />
        </session-factory>
    </hibernate-configuration>
    

    这是固定格式,其中dialect表示使用的数据库类型,connection.connection_string 表示连接字符串。mapping表示映射关系文件所在项目。

    2.3 获取ISessionFactory

    然后获取一个ISessionFactory:

    Configuration cfg = new Configuration();
    var sessionFactory = cfg.BuildSessionFactory();
    

    当然,如果直接运行代码的话,会在 BuildSessionFactory这里报错。因为没有为SQL Server安装数据访问驱动:

    System.Data.SqlClient
    

    将数据访问驱动安装成功后,运行可以获得sessionFactory。

    sessionFactory用来创建一个访问数据库的Session

    2.4 增删改查

    先来个简单的示例类:

    public class Cat
    {
        public virtual string Id { get; set; }
        public virtual string Name { get; set; }
        public virtual char Sex { get; set; }
        public virtual float Weight { get; set; }
    }
    

    NHibernate的映射关系文件:Cat.hbm.xml

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="dataprovider" assembly="dataprovider">
      <class name="Cat" table="Cat">
    
        <!-- A 32 hex character is our surrogate key. It's automatically
                generated by NHibernate with the UUID pattern. -->
        <id name="Id">
          <column name="CatId" sql-type="char(32)" not-null="true"/>
          <generator class="uuid.hex" />
        </id>
        <!-- A cat has to have a name, but it shouldn't be too long. -->
        <property name="Name">
          <column name="Name" length="16" not-null="true" />
        </property>
        <property name="Sex" />
        <property name="Weight" />
      </class>
    </hibernate-mapping>
    

    创建完成后,右键选中文件,修改文件生成操作为嵌套的资源

    image-20200519000456989

    然后编写实例代码:

    Configuration cfg = new Configuration().Configure();
    
    using (var sessionFactory = cfg.BuildSessionFactory())
    using (var session = sessionFactory.OpenSession())
    {
    // 通过session操作
        session.Close();
    }
    

    新增一个Cat:

    var princess = new Cat
    {
        Name = "Princess",
        Sex = 'F',
        Weight = 7.4f
    };
    session.Save(princess);
    session.Flush();//推送修改给数据库,不调用的话数据库里将没有数据
    

    查询并修改:

    var cats = session.Query<Cat>().ToList();
    var cat = cats.First();
    cat.Name = "xiao li";
    session.Update(cat);
    session.Flush();
    

    查询并删除:

    var cats = session.Query<Cat>().ToList();
    var cat = cats.First();
    session.Delete(cat);
    session.Flush();
    

    这是NHibernate的入门级的入门教程。嗯,给大家一个NHibernate的图:

    img

    3. 总结

    NHibernate延续了Hibernate的优点,如果之前了解过Hibernate的人上手不难。轻量简单,不过得需要配置文件。下一期将带领大家继续深入研究NHibernate。

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

    file

  • 相关阅读:
    1864: [Zjoi2006]三色二叉树
    3611: [Heoi2014]大工程
    2286: [Sdoi2011]消耗战
    2298: [HAOI2011]problem a
    2037: [Sdoi2008]Sue的小球
    P4512 【模板】多项式除法
    P4238 【模板】多项式求逆
    3771: Triple
    P3365 改造二叉树
    1191: [HNOI2006]超级英雄Hero
  • 原文地址:https://www.cnblogs.com/c7jie/p/12921371.html
Copyright © 2020-2023  润新知