• C# 中NHibernate使用及配置映射


    1. 新建一个控制台项目
    2. 主要项目结构如下:

    Model 实体

    Mapping 主要做映射表关系文件

    UserManager 做业务逻辑处理

    1. 添加项目Nuget包Nhibernate引用
    2. 创建NhibernateHelper 帮助类来实例化我们ISessionFactory工厂类

    其中NHibernate.Cfg.Configuration 的一个实例表示应用程序的 .NET 类型到 SQL 数据库的一整组映射。配置用于构建(不可变的)ISessionFactory。映射是从各种 XML 映射文件编译而来的。

     5.添加映射文件xml及实体User类

    AddAssembly中添加分为两部分xml映射配置:

    a.配置映射所有实体对应的命名空间,NHibernate 将在程序集中查找以 .hbm 结尾的任何资源.xml。此方法消除了任何硬编码的文件名,并确保添加程序集中的映射文件。例如User 实体 可以对应xml文件为User.hbm.xml …注意此处.hbm结尾必须要有

    当然也可以在Hibernate.cfg.xml文件中指定文件

    1. <session-factory>
    2.      <mapping resource="InfraStructureDemo.Mapping.User.hbm.xml" assembly="InfraStructureDemo" />
    3. session-factory>

    User的配置映射文件可以参考如下

    1. <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    2.                    assembly="InfraStructureDemo"
    3.                    namespace="InfraStructureDemo.Model">
    4. <class name="User" table="Users">
    5. <id name="Id" column="Id" type="Int32">
    6. <generator class="native">generator>
    7. id>
    8. <property name="UserName" column="UserName" type="string">property>
    9. <property name="Password" column="Password" type="string">property>
    10. <property name="LoginTime" column="LoginTime" type="Date">property>
    11. class>
    12. hibernate-mapping>

    其中property  中第一个name表示实体名称column对应我们数据库中表中字段名称,

    Namespace 对应EntityModel的命名空间 还要指定Model程序集名称

    代表主键的生成规则

    b.根目录创建 HibernateMssql.cfg.xmlcfg.xml(这个主要针对数据库驱动还有链接字符串之类的数据库链接配置设置文件)

    Nhibernatehelper中可以使用cfg.Configure("./HibernateMssql.cfg.xml");//解析配置文件 或者cfg..AddFile("HibernateMssql.cfg.xml");   进行配置添加

    c.创建实体类

    Cfg.xml数据库配置可以参考如下代码或者在下载的Nuget包目录地址下有参考各个数据库的配置

    C:\Users\\.nuget\packages\nhibernate\5.3.12\ConfigurationTemplates

    具体我们以mssql为例 代码配置如下

    1. <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
    2. <session-factory name="NHibernate.Test">
    3. <property name="connection.driver_class">NHibernate.Driver.SqlClientDriverproperty>
    4. <property name="connection.connection_string">
    5. Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=nhibernate;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False
    6. property>
    7. <property name="dialect">NHibernate.Dialect.MsSql2008Dialectproperty>
    8. <property name="show_sql">trueproperty>
    9.  
    10. session-factory>
    11. hibernate-configuration>

    以上通过Xml配置的也可以使用Mapping类文件对应的去做fluent配置类似于efcore中那种:

    1. public class BookMapping:ClassMapping<Book>
    2.     {
    3.         public BookMapping()
    4.         {
    5.             Schema("dbo");
    6.             Table("Book");
    7.             Id(entity => entity.BookId, mapping =>
    8.             {
    9.                 mapping.Column("BookId");
    10.                 mapping.Generator(Generators.Identity);
    11.             });
    12.             Property(entity => entity.BookName, mapping => mapping.Column("BookName"));
    13.             Property(entity => entity.Description, mapping => mapping.Column("Description"));
    14.             //多对一
    15.             ManyToOne(entity => entity.Library, m =>
    16.             {
    17.                 m.Column("LibraryId");
    18.                 m.ForeignKey("FK_Book_Library");
    19.             });
    20.           
    21.         }
    22.     }
    23.  public class LibraryMapping : ClassMapping<Library>
    24.     {
    25.         public LibraryMapping()
    26.         {
    27.            
    28.             Schema("dbo");
    29.             Table("Library");
    30.             Id(entity => entity.LibraryId, mapping =>
    31.             {
    32.                 mapping.Column("LibraryId");
    33.                 mapping.Generator(Generators.Identity);
    34.             });
    35.             Property(entity => entity.LibraryName, mapping => mapping.Column("LibraryName"));
    36.             Property(entity => entity.Description, mapping => mapping.Column("Description"));
    37.             // 一对多
    38.             Bag(entity => entity.Books, m =>
    39.             {
    40.                 m.Inverse(true);
    41.                 m.Cascade(Cascade.None);
    42.                 m.Key(k => k.Column("LibraryId"));
    43.             }, action => action.OneToMany());
    44.         }
    45.     }

    6.封装具体业务逻辑代码(增删改等查询)

    具体代码如下

    1.   public class UserManagerService
    2.     {
    3.         public static UserManagerService UserService = new UserManagerService();
    4.         public bool Add(User user)
    5.         {
    6.             using (var session = NhibernateHelper.SessionFactory.OpenSession())
    7.             {
    8.                 using (ITransaction transaction = session.BeginTransaction())
    9.                 {
    10.                     var res = session.Save(user);
    11.                     session.Flush();
    12.                     transaction.Commit();
    13.                     return string.IsNullOrEmpty(res.ToString());
    14.                 }
    15.             }
    16.         }
    17.         public void Update(User user)
    18.         {
    19.             using (var session = NhibernateHelper.SessionFactory.OpenSession())
    20.             {
    21.                 using (ITransaction transaction = session.BeginTransaction())
    22.                 {
    23.                     session.Update(user);
    24.                     //session.SaveOrUpdate(user);
    25.                     transaction.Commit();
    26.                 }
    27.             }
    28.         }
    29.         public void Delete(User user)
    30.         {
    31.             using (var session = NhibernateHelper.SessionFactory.OpenSession())
    32.             {
    33.                 using (ITransaction transaction = session.BeginTransaction())
    34.                 {
    35.                     session.Delete(user);
    36.                     transaction.Commit();
    37.                 }
    38.             }
    39.         }
    40.         public User GetUserById(int userId)
    41.         {
    42.             using (var session = NhibernateHelper.SessionFactory.OpenSession())
    43.             {
    44.                 using (ITransaction transaction = session.BeginTransaction())
    45.                 {
    46.                     var user = session.Get(userId);
    47.                     transaction.Commit();
    48.                     return user;
    49.                 }
    50.             }
    51.         }
    52.         public IList GetAllUsers()
    53.         {
    54.             using (var session = NhibernateHelper.SessionFactory.OpenSession())
    55.             {
    56.                 using (ITransaction transaction = session.BeginTransaction())
    57.                 {
    58.                     var user = session.Query().ToList();
    59.                     transaction.Commit();
    60.                     return user;
    61.                 }
    62.             }
    63.         }
    64.         public User GetUserByName(string name)
    65.         {
    66.             using (var session = NhibernateHelper.SessionFactory.OpenSession())
    67.             {
    68.                 var user = session.CreateCriteria().Add(Restrictions.Eq("UserName", name)).UniqueResult();
    69.                 return user;
    70.             }
    71.         }
    72.         public IList GetUserListByQuery(Expressionbool>> where)
    73.         {
    74.             try
    75.             {
    76.                 using (var session = NhibernateHelper.SessionFactory.OpenSession())
    77.                 {
    78.                     var users = session.Query().Where(where).ToList();
    79.                     return users;
    80.                 }
    81.             }
    82.             catch (Exception ex)
    83.             {
    84.                 throw ex;
    85.             }
    86.         }
    87.     }

    详细的操作及内置方法可以参考官方文档 NHibernate - Relational Persistence for Idiomatic .NET

    7.创建对应表建立表关系主外键配置id设置自增1

    8.添加主外键关系表的数据执行

    9.以上的Book映射文件及Library类的Mapping映射文件如下可以配置一对多关系

    1. <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    2.                    assembly="InfraStructureDemo"
    3.                    namespace="InfraStructureDemo.Model">
    4. <class name="Book" table="Book">
    5. <id name="BookId" column="BookId" type="Int32">
    6. <generator class="native">generator>
    7. id>
    8. <property name="BookName" column="BookName" type="string">property>
    9. <property name="Description" column="Description" type="string">property>
    10. <many-to-one name="Library" class="InfraStructureDemo.Model.Library" column="LibraryId" />
    11. class>
    12. hibernate-mapping>
    13. <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    14.                    assembly="InfraStructureDemo"
    15.                    namespace="InfraStructureDemo.Model">
    16. <class name="Library" table="Library">
    17. <id name="LibraryId" column="LibraryId" type="Int32">
    18. <generator class="native">generator>
    19. id>
    20. <property name="LibraryName" column="LibraryName" type="string">property>
    21. <property name="Description" column="Description" type="string">property>
    22. <bag name="Books"
    23.             inverse="true"
    24.             lazy="false"
    25.             cascade="all">
    26. <key column="LibraryId"/>
    27. <one-to-many class="Book"/>
    28. bag>
    29. class>
    30. hibernate-mapping>

    以上就是关于Nhibernate的全部内容

    当然如果觉得xml配置比较麻烦 不灵活 我们可以指定具体映射类的形式去进行配置,

           

    1. // 添加代码mapping
    2.             //mapper.AddMapping();
    3.             //mapper.AddMapping();
    4.             //var mapping = mapper.CompileMappingFor(new[] { typeof(LibraryMapping), typeof(UserMapping), typeof(BookMapping) });
    5.             //ClassMappingService.GetMapping();
    6.             //var mapping = mapper.CompileMappingForAllExplicitlyAddedEntities();
    7.             //config.AddMapping(mapping);

       不过以上会报错 具体原因我目前还有找出来,Git上有专门针对Mapping类文件的NHibernate库 可以搜索FluentNHibernate Nuget包安装

    官方文档参考地址

    https://nhibernate.info/doc/nh/en/index.html#configuration-programmatic

  • 相关阅读:
    希尔排序
    【JQuery】JQuery入门——知识点讲解(一)
    python CV2库
    【Redis学习笔记】第八章 Redis删除策略
    汉字风格迁移篇---W-net:基于深度神经网络的一次任意风格汉字生成
    【Verilog 设计】Verilog 实现偶数、奇数分频和任意小数分频
    HTML静态网页作业——电影介绍-你的名字 5页 无js 带音乐
    Dialog组件
    wireshark使用host文件做IP域名解析
    Servlet快速入门
  • 原文地址:https://blog.csdn.net/andy5520/article/details/126037866