分享
 
 
 

通俗易懂的Nhibernate教程-----基本操作,映射,CURD

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: |||超大  

网站架构:

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-configurationxmlns="urn:nhibernate-configuration-2.2"><!--Nhibernate对数据库操作是基于Isession(会话),可以理解为SqlConnection的封装,可通过SessionFactory创建--><session-factoryname="XShop"><!--连接提供程序--><PRopertyname="connection.provider">NHibernate.Connection.DriverConnectionProvider</property><!--连接字符串--><propertyname="connection.connection_string">Server=.;initial catalog=XShopDb;Integrated Security=SSPI</property><!--Nhibernate是一个支持多个数据库的Orm框架,然而几乎每个数据库产品都对Sql的实现都有所不同--><!--Nhibernate通过dialect(方言)消除数据库之间的差异--><propertyname="dialect">NHibernate.Dialect.MsSql2008Dialect</property><!--是否在调试的时候打印Sql语句--><propertyname="show_sql">true</property><!--映射文件所在的程序集--><mappingassembly="Mapping"/></session-factory></hibernate-configuration>

温馨提示:如果发现在编写xml文件的时候发现没有智能提示,请把Nhibernate包的xsd文件复制到Vs安装目录中(参考百度)

注意:Nhibernate配置文件的文件名必须为 hibernate.cfg.xml ,不可随意更改

第三步:创建实体类 Customer(Model项目)

3.1 代码

namespaceModel

{publicclassCustomer

{publicvirtualintId {get;set; }publicvirtualstringName {get;set; }publicvirtualstringUserName {get;set; }publicvirtualstringPassWord{get;set; }publicvirtualDateTime CreateTime {get;set; }

}

}

注意:实体类的属性必须是virtual,否则Nhibernate会报错.why?因为这样Nhibernate就可以重写这些属性的访问逻辑,比如 延迟加载..

第四步:创建 Customer.hbm.xml 映射文件(Mapping项目)

4.1 代码:

<?xml version="1.0" encoding="utf-8"?><hibernate-mappingxmlns="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="对应的表名" >--><classname="Customer"table="Customer"><!--id是必须的--><!--<id name="Id的属性名" column="列名" type="数据类型" unsaved-value="未被持久化到数据库时,id的值" generator="id的生成策略"></id>--><idname="Id"column="CustomerId"type="int"unsaved-value="0"generator="native"></id><!--<property name="属性名" column="对应的列名" length="长度" type="数据类型" not-null="是否不可空"></property>--><propertyname="Name"column="Name"length="20"type="string"not-null="true"></property><propertyname="UserName"><columnname="UserName"sql-type="nvarchar"not-null="true"length="20"></column></property><propertyname="Password"length="32"column="Password"not-null="true"type="string"></property><propertyname="CreateTime"column="CreateTime"type="datetime"not-null="true"></property></class></hibernate-mapping>

注意:

1.映射文件命名规则: 类名.hbm.xml ,不可随意更改

2.映射文件的生成策略必须为:嵌入到程序集

第五步:创建数据库和表

5.1 创建数据库

CREATEDATABASEXShopDbGO

5.2 创建表

5.2.1创建表的两种方式--手动创建

注意:创建的表结构应该与映射文件一样

5.2.1创建表的两种方式--使用SchemaExport生成的Sql

代码:可以创建一个控制台项目或Winform项目跑下面这段代码

NHibernate.Cfg.Configuration configuration =newNHibernate.Cfg.Configuration().Configure();

NHibernate.Tool.hbm2ddl.SchemaExport schemaExport=newNHibernate.Tool.hbm2ddl.SchemaExport(configuration);//打印Sql脚本,但不执行schemaExport.Create(true,false);//导出到文件//schemaExport.SetOutputFile(@"c:/schma.sql");

结果:

第六步:CURD操作(Data项目)

6.1 上面我们提过,所有数据库操作都是通过ISession对象操作,而ISession可以通过ISessionFactory创建

-----创建HbmHelper类--获取ISessionFactory

namespaceData

{publicclassHbmHelper

{privatestaticISessionFactory _sessionFactory;publicstaticISessionFactory CurrentSessionFactory

{get{if(_sessionFactory ==null)

{//创建SessionFactory_sessionFactory =newConfiguration().Configure().BuildSessionFactory();

}return_sessionFactory;

}

}

}

}

-------从ISessionFactory中创建session

privateISession _session = HbmHelper.CurrentSessionFactory.OpenSession();

------添加数据访问基类 BaseDal<T>

namespaceData

{///<summary>///数据访问基类///</summary>///<typeparam name="T"></typeparam>publicclassBaseDal<T>whereT :class{//从ISessionFactory中创建sessionprivateISession _session =HbmHelper.CurrentSessionFactory.OpenSession();#region------------------ CURD ----------------///<summary>///添加数据///</summary>///<param name="model"></param>publicintInsert(T model)

{intid=(int) _session.Save(model);

_session.Flush();returnid;

}///<summary>///更新///</summary>///<param name="model"></param>publicvoidUpdate(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>publicvoidDelete(T model)

{

_session.Delete(model);

_session.Flush();

}///<summary>///查询///</summary>///<param name="id"></param>///<returns></returns>publicT Query(intid)

{return_session.Get<T>(id);

}#endregion}

}

第七步:添加数据,测试

7.1 添加数据

7.2 创建单元测试项目,添加测试类:

namespaceDataTest

{

[TestClass]publicclassBaseDalTest

{privateBaseDal<Customer> _customerDal =newBaseDal<Customer>();

[TestMethod]publicvoidGetTest()

{varresult = _customerDal.Query(1);

Assert.AreEqual(result.Name,"张小军");

}

[TestMethod]publicvoidInsertTest()

{

Customer customer=newCustomer()

{

Name="张三",

Password="654321",

UserName="zhs"};intid =_customerDal.Insert(customer);varresult =_customerDal.Query(id);

Assert.AreEqual(customer.UserName, result.UserName);

}

[TestMethod]publicvoidUpdateTest()

{varresult = _customerDal.Query(1);

result.Name="王五";

_customerDal.Update(result);varr2 = _customerDal.Query(1);

Assert.AreEqual(result.Name,r2.Name);

}

[TestMethod]publicvoidDelTest()

{varresult = _customerDal.Query(1);

_customerDal.Delete(result);varr2 = _customerDal.Query(1);

Assert.IsNotNull(r2);

}

}

}

代码:http://files.cnblogs.com/files/zhxj/XShop0822.zip原创文章,转载请注明出处:http://www.cnblogs.com/zhxj/

2015.08.22 --张小军

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有