栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

C# 中NHibernate使用及配置映射

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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文件中指定文件



     

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































其中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\.nugetpackagesnhibernate5.3.12ConfigurationTemplates

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











NHibernate.Driver.SqlClientDriver



Data Source=(localdb)MSSQLLocalDB;Initial Catalog=nhibernate;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False



NHibernate.Dialect.MsSql2008Dialect

true



 









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

public class BookMapping:ClassMapping

    {

        public BookMapping()

        {

            Schema("dbo");

            Table("Book");

            Id(entity => entity.BookId, mapping =>

            {

                mapping.Column("BookId");

                mapping.Generator(Generators.Identity);

            });

            Property(entity => entity.BookName, mapping => mapping.Column("BookName"));

            Property(entity => entity.Description, mapping => mapping.Column("Description"));



            //多对一

            ManyToOne(entity => entity.Library, m =>

            {

                m.Column("LibraryId");

                m.ForeignKey("FK_Book_Library");

            });

          

        }

    }





 public class LibraryMapping : ClassMapping

    {

        public LibraryMapping()

        {

           

            Schema("dbo");

            Table("Library");

            Id(entity => entity.LibraryId, mapping =>

            {

                mapping.Column("LibraryId");

                mapping.Generator(Generators.Identity);

            });

            Property(entity => entity.LibraryName, mapping => mapping.Column("LibraryName"));

            Property(entity => entity.Description, mapping => mapping.Column("Description"));

            // 一对多

            Bag(entity => entity.Books, m =>

            {

                m.Inverse(true);

                m.Cascade(Cascade.None);

                m.Key(k => k.Column("LibraryId"));

            }, action => action.OneToMany());

        }

    }

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

具体代码如下

  public class UserManagerService

    {



        public static UserManagerService UserService = new UserManagerService();

        public bool Add(User user)

        {



            using (var session = NhibernateHelper.SessionFactory.OpenSession())

            {

                using (ITransaction transaction = session.BeginTransaction())

                {

                    var res = session.Save(user);

                    session.Flush();

                    transaction.Commit();

                    return string.IsNullOrEmpty(res.ToString());

                }

            }

        }

        public void Update(User user)

        {



            using (var session = NhibernateHelper.SessionFactory.OpenSession())

            {

                using (ITransaction transaction = session.BeginTransaction())

                {

                    session.Update(user);

                    //session.SaveOrUpdate(user);

                    transaction.Commit();

                }

            }

        }



        public void Delete(User user)

        {



            using (var session = NhibernateHelper.SessionFactory.OpenSession())

            {

                using (ITransaction transaction = session.BeginTransaction())

                {

                    session.Delete(user);

                    transaction.Commit();

                }

            }

        }

        public User GetUserById(int userId)

        {



            using (var session = NhibernateHelper.SessionFactory.OpenSession())

            {

                using (ITransaction transaction = session.BeginTransaction())

                {

                    var user = session.Get(userId);

                    transaction.Commit();

                    return user;

                }

            }

        }

        public IList GetAllUsers()

        {



            using (var session = NhibernateHelper.SessionFactory.OpenSession())

            {

                using (ITransaction transaction = session.BeginTransaction())

                {

                    var user = session.Query().ToList();

                    transaction.Commit();

                    return user;

                }

            }

        }

        public User GetUserByName(string name)

        {



            using (var session = NhibernateHelper.SessionFactory.OpenSession())

            {



                var user = session.CreateCriteria().Add(Restrictions.Eq("UserName", name)).UniqueResult();



                return user;

            }

        }

        public IList GetUserListByQuery(Expression> where)

        {



            try

            {

                using (var session = NhibernateHelper.SessionFactory.OpenSession())

                {

                    var users = session.Query().Where(where).ToList();

                    return users;

                }

            }

            catch (Exception ex)

            {

                throw ex;

            }

        }

    }

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

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

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

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











































































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

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

       

 // 添加代码mapping

            //mapper.AddMapping();

            //mapper.AddMapping();



            //var mapping = mapper.CompileMappingFor(new[] { typeof(LibraryMapping), typeof(UserMapping), typeof(BookMapping) });



            //ClassMappingService.GetMapping();

            //var mapping = mapper.CompileMappingForAllExplicitlyAddedEntities();



            //config.AddMapping(mapping);

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

官方文档参考地址

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1032090.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号