NHibernate访问SQLite初步经验小结
2012-03-15 17:52 贼寇在何方 阅读(1258) 评论(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