目錄
寫在前面
昨天有朋友問我在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
