- 新建一个控制台项目
- 主要项目结构如下:
Model 实体
Mapping 主要做映射表关系文件
UserManager 做业务逻辑处理
- 添加项目Nuget包Nhibernate引用
- 创建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



