通俗易懂的Nhibernate教程(1) ----- 基本操作,映射,CURD
网站架构:
1.图片
2.说明
Data ----------------------- 类库项目,数据访问层,由Nhibernate提供数据相关操作
Mapping ------------------- 类库项目,映射文件都在这个项目中
Model -------------------- 类型项目,实体层
XShop -------------------- Mvc项目,UI层
步骤:
1.安装Nhibernate
2.配置Nhibernate
3.创建实体类
4.编写映射文件
5.创建数据库/表
6.CURD操作
7.测试
第一步:安装Nhibernate,这一步就不用说了,使用Nuget安装,看图
第二步:配置Nhibernate
2.1 这一步主要是一些系统级的配置,如:连接字符串,数据库驱动,数据库方言等
2.2 创建 hibernate.cfg.xml文件(XShop项目中)
<?xml version="1.0" encoding="utf-8" ?> <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> <!--Nhibernate对数据库操作是基于ISession(会话),可以理解为SqlConnection的封装,可通过SessionFactory创建--> <session-factory name="XShop"> <!--连接提供程序--> <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> <!--连接字符串--> <property name="connection.connection_string"> Server=.;initial catalog=XShopDb;Integrated Security=SSPI </property> <!--Nhibernate是一个支持多个数据库的Orm框架,然而几乎每个数据库产品都对Sql的实现都有所不同--> <!--Nhibernate通过dialect(方言)消除数据库之间的差异--> <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property> <!--是否在调试的时候打印Sql语句--> <property name="show_sql">true</property> <!--映射文件所在的程序集--> <mapping assembly="Mapping"/> </session-factory> </hibernate-configuration>
温馨提示:如果发现在编写xml文件的时候发现没有智能提示,请把Nhibernate包的xsd文件复制到Vs安装目录中(参考百度)
注意:Nhibernate配置文件的文件名必须为 hibernate.cfg.xml ,不可随意更改
第三步:创建实体类 Customer(Model项目)
3.1 代码
namespace Model { public class Customer { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual string UserName { get; set; } public virtual string Password { get; set; } public virtual DateTime CreateTime { get; set; } } }注意:实体类的属性必须是virtual,否则Nhibernate会报错.why?因为这样Nhibernate就可以重写这些属性的访问逻辑,比如 延迟加载..
第四步:创建 Customer.hbm.xml 映射文件(Mapping项目)
4.1 代码:
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Model" auto-import="true" default-cascade="all" default-lazy="true" namespace="Model"> <!--<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="实体类所在的程序集" auto-import="是否自动导入命名空间,如果否,下面类名应该写类的全名" default-cascade="默认的级联操作" default-lazy="是否延迟加载" namespace="实体类所在的命名空间">--> <!--<class name="类型名/类型全名" table="对应的表名" >--> <class name="Customer" table="Customer" > <!--id是必须的--> <!--<id name="Id的属性名" column="列名" type="数据类型" unsaved-value="未被持久化到数据库时,id的值" generator="id的生成策略"></id>--> <id name="Id" column="CustomerId" type="int" unsaved-value="0" generator="native"></id> <!--<property name="属性名" column="对应的列名" length="长度" type="数据类型" not-null="是否不可空"></property>--> <property name="Name" column="Name" length="20" type="string" not-null="true"></property> <property name="UserName"> <column name="UserName" sql-type="nvarchar" not-null="true" length="20"></column> </property> <property name="Password" length="32" column="Password" not-null="true" type="string"></property> <property name="CreateTime" column="CreateTime" type="datetime" not-null="true"></property> </class> </hibernate-mapping>
注意:
1.映射文件命名规则: 类名.hbm.xml ,不可随意更改
2.映射文件的生成策略必须为:嵌入到程序集
第五步:创建数据库和表
5.1 创建数据库
CREATE DATABASE XShopDb GO
5.2 创建表
5.2.1创建表的两种方式--手动创建
注意:创建的表结构应该与映射文件一样
5.2.1创建表的两种方式--使用SchemaExport生成的Sql
代码:可以创建一个控制台项目或Winform项目跑下面这段代码
NHibernate.Cfg.Configuration configuration = new NHibernate.Cfg.Configuration().Configure(); NHibernate.Tool.hbm2ddl.SchemaExport schemaExport = new NHibernate.Tool.hbm2ddl.SchemaExport(configuration); //打印Sql脚本,但不执行 schemaExport.Create(true, false); //导出到文件 //schemaExport.SetOutputFile(@"c:/schma.sql");结果:
第六步:CURD操作(Data项目)
6.1 上面我们提过,所有数据库操作都是通过ISession对象操作,而ISession可以通过ISessionFactory创建
-----创建HbmHelper类--获取ISessionFactory
namespace Data { public class HbmHelper { private static ISessionFactory _sessionFactory; public static ISessionFactory CurrentSessionFactory { get { if (_sessionFactory == null) { //创建SessionFactory _sessionFactory = new Configuration().Configure().BuildSessionFactory(); } return _sessionFactory; } } } }
-------从ISessionFactory中创建session
private ISession _session = HbmHelper.CurrentSessionFactory.OpenSession();
------添加数据访问基类 BaseDal<T>
namespace Data { /// <summary> /// 数据访问基类 /// </summary> /// <typeparam name="T"></typeparam> public class BaseDal<T> where T : class { //从ISessionFactory中创建session private ISession _session = HbmHelper.CurrentSessionFactory.OpenSession(); #region ------------------ CURD ---------------- /// <summary> /// 添加数据 /// </summary> /// <param name="model"></param> public int Insert(T model) { int id=(int) _session.Save(model); _session.Flush(); return id; } /// <summary> /// 更新 /// </summary> /// <param name="model"></param> public void Update(T model) { //使用事务 using (ITransaction ts = _session.BeginTransaction()) { try { _session.Update(model); _session.Flush(); ts.Commit(); } catch (Exception) { ts.Rollback(); throw; } } } /// <summary> /// 删除 /// </summary> /// <param name="model"></param> public void Delete(T model) { _session.Delete(model); _session.Flush(); } /// <summary> /// 查询 /// </summary> /// <param name="id"></param> /// <returns></returns> public T Query(int id) { return _session.Get<T>(id); } #endregion } }
第七步:添加数据,测试
7.1 添加数据
7.2 创建单元测试项目,添加测试类:
namespace DataTest { [TestClass] public class BaseDalTest { private BaseDal<Customer> _customerDal = new BaseDal<Customer>(); [TestMethod] public void GetTest() { var result = _customerDal.Query(1); Assert.AreEqual(result.Name, "张小军"); } [TestMethod] public void InsertTest() { Customer customer = new Customer() { Name = "张三", Password = "654321", UserName = "zhs" }; int id = _customerDal.Insert(customer); var result = _customerDal.Query(id); Assert.AreEqual(customer.UserName, result.UserName); } [TestMethod] public void UpdateTest() { var result = _customerDal.Query(1); result.Name = "王五"; _customerDal.Update(result); var r2 = _customerDal.Query(1); Assert.AreEqual(result.Name,r2.Name); } [TestMethod] public void DelTest() { var result = _customerDal.Query(1); _customerDal.Delete(result); var r2 = _customerDal.Query(1); Assert.IsNotNull(r2); } } }
代码:https://files.cnblogs.com/files/zhxj/XShop0822.zip
原创文章,转载请注明出处:http://www.cnblogs.com/zhxj/
2015.08.22 --张小军