Nhibernate入门篇连接Sqlserver的增删查改

时间:2021-06-12 17:31:44

第一步:创建数据库

create table Emp(
EmpId int primary key identity,
EmpName varchar(50),
EmpDate date
)

第二步:去官网下载:http://nhibernate.info/  nhibernate

第三步:创建一个vs项目

第四步:添加nhibernate的类库

Nhibernate入门篇连接Sqlserver的增删查改

第五步:添加和数据库中类型相对应的类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace NhibernateDemoApp
{
public class Emp
{
public virtual int EmpId { get; set; }
public virtual string EmpName { get; set; }
public virtual DateTime EmpDate { get; set; }
}
}

第六步:创建emp.hbl.xml文件

第七步:添加智能提示

Nhibernate入门篇连接Sqlserver的增删查改

Nhibernate入门篇连接Sqlserver的增删查改

第七步:将xml设置为内嵌的

Nhibernate入门篇连接Sqlserver的增删查改

写xml的代码


<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NhibernateDemoApp" namespace="NhibernateDemoApp">
<class name="Emp" table="Emp">
<id name="EmpId">
<generator class="native"/>
</id>
<property name="EmpName"></property>
<property name="EmpDate"></property>
</class>
</hibernate-mapping>

 
  • 注意hibernate-mapping的assembly、namespace属性要填写正确
  • class的name属性表示类名,table是映射的表名,如果类名称和表名称相同,可以省略table属性
  • property的name属性是类的属性名,如果类属性名和表的列名相同,可以省略column属性
  • property的type属性表示.net类属性映射的NHibernate数据类型。如果是int、bool、double这样的.net基础数据类型,则可以省略
  • property的type属性如果是DateTime、string,也可以省略
  • property的not-null属性对应关系表的列的nullable属性,默认值是false。因此,如果允许为空,则可以省略
  • id表示主键,name为主键名,<generator class="native"/>表示数据表的主键按简单Identity的自增算法生成新记录主键值(NHibernate提供了多种主键值生成算法,这里只用最简单的Identity算法)
  • 文件名必须以.hbm.xml结尾 

下载开始写正式的增删查改的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Dialect;
using NHibernate.Driver;
using System.Reflection;
namespace NhibernateDemoApp
{
class Program
{
private static ISessionFactory _sessionFactory;
public static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{
var cfg = new Configuration();
cfg.DataBaseIntegration(x =>
{
x.ConnectionString = "Data Source=localhost;Initial Catalog=NHibernateDemoDB;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";
x.Driver<SqlClientDriver>();
x.Dialect<MsSql2008Dialect>();
});
//告诉nhibernate加载xml的地方
cfg.AddAssembly(Assembly.GetExecutingAssembly());
//构建nhibernate
_sessionFactory = cfg.BuildSessionFactory();
}
return _sessionFactory;
}
}
static void Main(string[] args)
{
IList<Emp> emps = GetAll();
foreach (var item in emps)
{
Console.WriteLine(item.EmpName);
}
Console.ReadKey();
}
#region crud
public static int Insert(Emp emp)
{
using(var session = SessionFactory.OpenSession())
{
var i= session.Save(emp);
session.Flush();//相当于savechange
return Convert.ToInt32(i);
}
}
public static void Delete(int id)
{
using(var session = SessionFactory.OpenSession())
{
var entity= session.Load<Emp>(id);
session.Delete(entity);
session.Flush();
}
}
public static void Update(Emp emp)
{
using(var session = SessionFactory.OpenSession())
{
session.SaveOrUpdate(emp);
session.Flush();
}
}
public static Emp GetEmpById(int id)
{
using(var session = SessionFactory.OpenSession())
{
Emp emp = session.Get<Emp>(id);
return emp;
}
}
public static IList<Emp> GetAll()
{
using(var session = SessionFactory.OpenSession())
{
IList<Emp> emps = session.CreateCriteria<Emp>().List<Emp>();
return emps;
}
}
#endregion
}
}

第一次写博客,如果有知识点没有说明白,请见谅