目录
写在前面
昨天有朋友问我在nhibernate中如何使用sqlite数据库,当时实在忙的不可开交,下周要去山西出差,实在没空,按我的说法使用sqlite跟使用sqlserver,本质上其实没啥区别,nhibernate的配置文件不同而已,而且在下载nhibernate的时候,他已经提供了针对不同的数据库的模版了。你只需在这基础上修改即可。
别人问到了,再加上即将的项目中需要用到sqlite数据库,就也趁着这股风总结一下,算是弄一个在nhibernate中使用sqlite的模版吧。
操作步骤
可视化工具:http://www.oschina.net/news/43608/5-popular-and-free-sqlite-management-tools
SqliteSpy:http://www.yunqa.de/delphi/doku.php/products/sqlitespy/index
说到sqlite,得创建一个sqlite数据库啊,上面的工具,你可以选择一个用着顺手的工具使用,我这里就使用sqlitespy这个工具,新建一个shop数据库,新建一个userinfo的数据表。
下载sqlite的dll:http://www.sqlite.org/,或者使用Nuget安装
创建数据表的sql语句
1 create table UserInfo 2 ( 3 ID int primary key not null, 4 UserName nvarchar(32), 5 Gender bit, 6 Age int, 7 Address nvarchar(128) 8 )
如图:
新建个测试用的项目,项目结构如图所示:
关于项目结构就不进行说明了,项目名称已经比较清楚了。
项目Wolfy.Data和Wolfy.UnitTest需要引用System.Data.SQLite.dll,并把SQLite.Interop.dll放在bin\debug下(因为这个dll是引用不了的)。
从下载的nhibernate中找到sqlite的数据库的配置模版
将名称修改为hibernate.cfg.xml,复制到单元测试项目下,并修改该文件的属性为始终复制,内容如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <!-- 3 This template was written to work with NHibernate.Test. 4 Copy the template to your NHibernate.Test project folder and rename it in hibernate.cfg.xml and change it 5 for your own use before compile tests in VisualStudio. 6 --> 7 <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" > 8 <session-factory name="NHibernate.Test"> 9 <property name="connection.driver_class">NHibernate.Driver.SQLite20Driver</property> 10 <property name="connection.connection_string"> 11 Data Source=nhibernate.db 12 </property> 13 <property name="dialect">NHibernate.Dialect.SQLiteDialect</property> 14 </session-factory> 15 </hibernate-configuration>
修改内容,使其使用于当前项目
1 <?xml version="1.0" encoding="utf-8"?> 2 <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" > 3 <session-factory name="sqlite_session"> 4 <property name="connection.driver_class">NHibernate.Driver.SQLite20Driver</property> 5 <property name="connection.connection_string"> 6 Data Source=C:\Users\Wolfy\Desktop\SQLiteSpy_1.9.8\Shop.db3 7 </property> 8 <property name="dialect">NHibernate.Dialect.SQLiteDialect</property> 9 <mapping assembly="Wolfy.Domain"/> 10 </session-factory> 11 </hibernate-configuration>
注意,把不必要的注释去掉,避免不不要的麻烦。
通用NHibernateHelper类
测试用的持久化类
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Wolfy.Domain.Entity 8 { 9 /// <summary> 10 /// 用户持久化类 11 /// </summary> 12 public class UserInfo 13 { 14 /// <summary> 15 /// 用户标识 16 /// </summary> 17 public virtual int ID { set; get; } 18 /// <summary> 19 /// 用户姓名 20 /// </summary> 21 public virtual string UserName { set; get; } 22 /// <summary> 23 /// 性别 24 /// </summary> 25 public virtual bool Gender { set; get; } 26 /// <summary> 27 /// 年龄 28 /// </summary> 29 public virtual int Age { set; get; } 30 /// <summary> 31 /// 住址 32 /// </summary> 33 public virtual string Address { set; get; } 34 } 35 }
对应的持久化类的映射文件,UserInfo.hbm.xml并修改其属性生成操作为“嵌入资源”
1 <?xml version="1.0" encoding="utf-8" ?> 2 <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Wolfy.Domain" namespace="Wolfy.Domain.Entity"> 3 <class name="Wolfy.Domain.Entity.UserInfo,Wolfy.Domain" table="UserInfo"> 4 <!--主键 如果没有设置值则默认为0--> 5 <id name="ID" type="Int32" unsaved-value="0"> 6 <column name="ID" sql-type="int" not-null="true" unique="true"/> 7 <!--主键自增--> 8 <generator class="increment"></generator> 9 </id> 10 <property name="UserName" type="String"> 11 <column name="UserName" sql-type="nvarchar" not-null="false"/> 12 </property> 13 <property name="Gender" type="Boolean"> 14 <column name="Gender" sql-type="bit" not-null="false"></column> 15 </property> 16 <property name="Age" type="Int32"> 17 <column name="Age" sql-type="int" not-null="false"></column> 18 </property> 19 <property name="Address" type="String"> 20 <column name="Address" sql-type="nvarchar" not-null="false"/> 21 </property> 22 </class> 23 </hibernate-mapping>
在Wolfy.Data下添加类UserInfoData
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using NHibernate.Cfg; 7 using NHibernate; 8 using Wolfy.Domain.Entity; 9 namespace Wolfy.Data 10 { 11 /// <summary> 12 /// 用户数据层操作 13 /// </summary> 14 public class UserInfoData 15 { 16 /// <summary> 17 /// 添加用户 18 /// </summary> 19 /// <param name="userInfo"></param> 20 /// <returns></returns> 21 public bool AddUserInfo(UserInfo userInfo) 22 { 23 ISession session = NHibernateHelper.GetOcextSession(); 24 using (ITransaction trans = session.BeginTransaction()) 25 { 26 try 27 { 28 session.SaveOrUpdate(userInfo); 29 session.Flush(); 30 trans.Commit(); 31 return true; 32 } 33 catch (Exception) 34 { 35 trans.Rollback(); 36 return false; 37 throw; 38 } 39 } 40 } 41 } 42 }
在单元测试项目下添加DataTest.cs进行单元测试,如下
1 using System; 2 using Microsoft.VisualStudio.TestTools.UnitTesting; 3 using Wolfy.Domain.Entity; 4 using Wolfy.Data; 5 6 namespace Wolfy.UnitTest 7 { 8 [TestClass] 9 public class DataTest 10 { 11 private UserInfoData _userInfoData; 12 public DataTest() 13 { 14 _userInfoData = new UserInfoData(); 15 } 16 [TestMethod] 17 public void AddUserInfoTest() 18 { 19 bool result = _userInfoData.AddUserInfo(new UserInfo() 20 { 21 Address = "北京", 22 Age = 25, 23 Gender = true, 24 UserName = "wolfy" 25 }); 26 Assert.IsTrue(result); 27 } 28 } 29 }
添加一个用户wolfy,并断言结果为true,即添加成功,测试结果,使用sqlitespy工具查看sqlite数据库中的数据
关于查删改的操作类似,就不再进行测试了。
总结
弄一个sqlite数据库的配置,其实也没多大难度,关键还是nhibernate的配置文件,及持久化类的映射文件这块,你把这两个弄通了,其他的都好说,基本上类似,比如映射文件,你完全可以把内容复制到其他持久化类的映射文件中,并在这个基础上改吧改吧就是一个新的,关键还是第一步,你有没有走通。总结就到这里吧,你在使用的过程中,如果用到sqlite,可以将上面nhibernate配置文件和userinfo的映射文件作为模版,使用的时候,就在这基础上改吧改吧就行了。本文已加入Nhibernate系列:http://www.cnblogs.com/wolf-sun/p/4138918.html
博客地址: | http://www.cnblogs.com/wolf-sun/ |
博客版权: | 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。 如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。http://www.cnblogs.com/wolf-sun/p/4160578.html |