目录
写在前面
昨天有朋友问我在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语句
create table UserInfo
(
ID int primary key not null,
UserName nvarchar(32),
Gender bit,
Age int,
Address nvarchar(128)
)
如图:
新建个测试用的项目,项目结构如图所示:
关于项目结构就不进行说明了,项目名称已经比较清楚了。
项目Wolfy.Data和Wolfy.UnitTest需要引用System.Data.SQLite.dll,并把SQLite.Interop.dll放在bin\debug下(因为这个dll是引用不了的)。
从下载的nhibernate中找到sqlite的数据库的配置模版
将名称修改为hibernate.cfg.xml,复制到单元测试项目下,并修改该文件的属性为始终复制,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<!--
This template was written to work with NHibernate.Test.
Copy the template to your NHibernate.Test project folder and rename it in hibernate.cfg.xml and change it
for your own use before compile tests in VisualStudio.
-->
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory name="NHibernate.Test">
<property name="connection.driver_class">NHibernate.Driver.SQLite20Driver</property>
<property name="connection.connection_string">
Data Source=nhibernate.db
</property>
<property name="dialect">NHibernate.Dialect.SQLiteDialect</property>
</session-factory>
</hibernate-configuration>
修改内容,使其使用于当前项目
<?xml version="1.0" encoding="utf-8"?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory name="sqlite_session">
<property name="connection.driver_class">NHibernate.Driver.SQLite20Driver</property>
<property name="connection.connection_string">
Data Source=C:\Users\Wolfy\Desktop\SQLiteSpy_1.9.8\Shop.db3
</property>
<property name="dialect">NHibernate.Dialect.SQLiteDialect</property>
<mapping assembly="Wolfy.Domain"/>
</session-factory>
</hibernate-configuration>
注意,把不必要的注释去掉,避免不不要的麻烦。
通用NHibernateHelper类
测试用的持久化类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Wolfy.Domain.Entity
{
/// <summary>
/// 用户持久化类
/// </summary>
public class UserInfo
{
/// <summary>
/// 用户标识
/// </summary>
public virtual int ID { set; get; }
/// <summary>
/// 用户姓名
/// </summary>
public virtual string UserName { set; get; }
/// <summary>
/// 性别
/// </summary>
public virtual bool Gender { set; get; }
/// <summary>
/// 年龄
/// </summary>
public virtual int Age { set; get; }
/// <summary>
/// 住址
/// </summary>
public virtual string Address { set; get; }
}
}
对应的持久化类的映射文件,UserInfo.hbm.xml并修改其属性生成操作为“嵌入资源”
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Wolfy.Domain" namespace="Wolfy.Domain.Entity">
<class name="Wolfy.Domain.Entity.UserInfo,Wolfy.Domain" table="UserInfo">
<!--主键 如果没有设置值则默认为0-->
<id name="ID" type="Int32" unsaved-value="0">
<column name="ID" sql-type="int" not-null="true" unique="true"/>
<!--主键自增-->
<generator class="increment"></generator>
</id>
<property name="UserName" type="String">
<column name="UserName" sql-type="nvarchar" not-null="false"/>
</property>
<property name="Gender" type="Boolean">
<column name="Gender" sql-type="bit" not-null="false"></column>
</property>
<property name="Age" type="Int32">
<column name="Age" sql-type="int" not-null="false"></column>
</property>
<property name="Address" type="String">
<column name="Address" sql-type="nvarchar" not-null="false"/>
</property>
</class>
</hibernate-mapping>
在Wolfy.Data下添加类UserInfoData
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NHibernate.Cfg;
using NHibernate;
using Wolfy.Domain.Entity;
namespace Wolfy.Data
{
/// <summary>
/// 用户数据层操作
/// </summary>
public class UserInfoData
{
/// <summary>
/// 添加用户
/// </summary>
/// <param name="userInfo"></param>
/// <returns></returns>
public bool AddUserInfo(UserInfo userInfo)
{
ISession session = NHibernateHelper.GetOcextSession();
using (ITransaction trans = session.BeginTransaction())
{
try
{
session.SaveOrUpdate(userInfo);
session.Flush();
trans.Commit();
return true;
}
catch (Exception)
{
trans.Rollback();
return false;
throw;
}
}
}
}
}
在单元测试项目下添加DataTest.cs进行单元测试,如下
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Wolfy.Domain.Entity;
using Wolfy.Data; namespace Wolfy.UnitTest
{
[TestClass]
public class DataTest
{
private UserInfoData _userInfoData;
public DataTest()
{
_userInfoData = new UserInfoData();
}
[TestMethod]
public void AddUserInfoTest()
{
bool result = _userInfoData.AddUserInfo(new UserInfo()
{
Address = "北京",
Age = ,
Gender = true,
UserName = "wolfy"
});
Assert.IsTrue(result);
}
}
}
添加一个用户wolfy,并断言结果为true,即添加成功,测试结果,使用sqlitespy工具查看sqlite数据库中的数据
关于查删改的操作类似,就不再进行测试了。
总结
弄一个sqlite数据库的配置,其实也没多大难度,关键还是nhibernate的配置文件,及持久化类的映射文件这块,你把这两个弄通了,其他的都好说,基本上类似,比如映射文件,你完全可以把内容复制到其他持久化类的映射文件中,并在这个基础上改吧改吧就是一个新的,关键还是第一步,你有没有走通。总结就到这里吧,你在使用的过程中,如果用到sqlite,可以将上面nhibernate配置文件和userinfo的映射文件作为模版,使用的时候,就在这基础上改吧改吧就行了。本文已加入Nhibernate系列:http://www.cnblogs.com/wolf-sun/p/4138918.html