代码改变世界

NHibernate访问SQLite初步经验小结

2012-03-15 17:52  贼寇在何方  阅读(1236)  评论(1编辑  收藏  举报

最近研究了下SQLite和SQLCe,比较了两种数据库在.Net环境下的各种ORM技术,最后选择了SQLite和NHibernate。 NHibernate脱胎与Java平台下著名的开源ORM项目Hibernate,支持多种主流数据库,经过数年发展,日趋成熟,并也以支持Linq 等.Net平台特性。


映射配置

使用NHibernate访问数据库,需要手动创建实体类映射配置文件。下面解析一下两者与数据表的关系。

数据表:User表

实体类:User.cs

public class User
{
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
public virtual string Password { get; set; }
public virtual string Email { get; set; }
}

映射配置文件:User.hbm.xml(生成操作:嵌入的资源

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly
="NHibernateSQLiteDemo" namespace="NHibernateSQLiteDemo.Entities">
<class name="User" table="User">
<id name="Id" column="Id">
<generator class="guid"></generator>
</id>
<property name="Name" column="Name" not-null="true"/>
<property name="Password" column="Password" not-null="true"/>
<property name="Email" column="Email" not-null="true"/>
</class>
</hibernate-mapping>

注意:映射配置文件的属性“生成操作”一定要设置成“嵌入的资源”,否则实体类就无法被NHibernate识别,引发异常:

数据库配置

映射配置文件用来描述实体类->数据库表以及实体类的属性(property name)->数据库表中的列(property column)的映射关系,是NHibernate实现O/R Mapping关键。

此外,由于NHiberate通过反射读取程序集的信息,所以映射配置文件 中的assembly和namespace一定不能填错。

NHibernate在建立数据库连接之前,需要读取配置文件,然后创建会话(ISession)。在会话中完成各种对数据库的操作。

配置文件Database.xml如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="hibernate-configuration"
type
="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/>
</configSections>

<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.db3;Version=3
</property>
<property name="dialect">NHibernate.Dialect.SQLiteDialect</property>
<property name="query.substitutions">true=1;false=0</property>
<mapping assembly="NHibernateSQLiteDemo" />
</session-factory>
</hibernate-configuration>
</configuration>

 

注意:这里面的mapping assembly一定不能写错,比如我的测试程序的程序集名称应该是NHibernateSQLiteDemo,误作NHibernateSQLite后,引发如下异常:

编写代码

最后上代码好了,
我采用的是CodeFirst的方式,也就是先建实体类,再用程序创建表结构
使用Linq需要添加NHibernate.Linq命名空间 

// 读取配置
var config = new Configuration().Configure("Database.xml");

// 创建表结构
SchemaMetadataUpdater.QuoteTableAndColumns(config);
new SchemaExport(config).Create(false, true);

// 打开Session
var sessionFactory = config.BuildSessionFactory();
using(var session = sessionFactory.OpenSession())
{
// 插入
var user = new User();
user.Name = "贼寇在何方";
user.Password = "********";
user.Email = "realh3@gmail.com";

session.Save(user);
session.Flush(); // 不使用事务的情况下必须Flush

// 查询
var userNow = session.Query<User>().FirstOrDefault();

// 修改
userNow.Name = "贼寇";
session.Flush();

// 删除就省了吧
}

 

源代码文件也发上来吧:NHibernateSQLiteDemo.7z