NHibernate的设计思想和冬眠的设计思想基本相同,都是为了避免频繁的编写结构化查询语言脚本,使用面向对象的方式使用hql语句进行查询。下面这篇文章主要给大家介绍了关于在C#项目中如何使用NHibernate的相关资料,需要的朋友可以参考借鉴,下面来一起学习学习吧。
前言
现代化大型项目通常使用独立的数据库来存储数据,其中以采用关系型数据库居多。用于开发项目的高级语言(C#、Java等)是面向对象的,而关系型数据库是基于关系的,两者之间的沟通需要一种转换,也就是对象/关系数据库映射(对象/关系映射,简称ORM)。
C#可用以解决对象/关系数据库映射的工具有多种,常见的有英孚(实体框架)、NHibernate、iBATIS等,各自的优缺点及适用场景在此不做讨论,本文只对如何使用NHibernate做个总结。
NHibernate是一个面向。网环境的对象/关系数据库映射工具。
1. 创建项目文件
在可视化工作室开发工具里创建需要的项目结构。
2. 添加对NHibernate的引用
当下载并解压NHibernate安装包后,电脑上就会创建一些目录,包括"必填_垃圾箱",要把必填_垃圾箱目录下的动态链接库引用到项目里来,它们是NHibernate使用的核心组件。
NHibernate.dll(基础类库,与数据库直接打交道,位于数据访问层)
Iesi .收藏(基础类库辅助类库,位于数据访问层)
Antlr3 .运行时(基础类库辅助类库,位于数据访问层)
伊比利亚人.字节码。Spring.dll(代理工厂类库,用于打开/关闭伊比利亚会议,位于数据访问层工具类库)
图一添加对NHibernate的引用
3. 配置NHibernate
文件:hibernate.cfg.xml,位于站点根目录。
?可扩展标记语言版本='1.0 '编码='utf-8 '?
冬眠配置xmlns=' urn:nhibernate-configuration-2.2 '
会话工厂
属性名='连接。driver _ class ' nhibernate。司机。sqlclientdriver/属性
属性名='connection.connection_string '
数据来源=120 .120 .200 .200;初始目录=MAMallPersist安全信息=真用户ID=mamall密码=mima123连接重置=假;连接生存期=50;最小池大小=1;最大池大小=500
/属性
属性名称=' adonet。batch _ size ' 10/属性
属性名='show_sql'true/property
property name=' dialect ' nhibernate。方言。MSSQL 2005方言/属性
属性名='命令超时' 10/属性
属性名='查询。替换'真1,假0,是' Y ',否' N '/属性
属性名='代理工厂。工厂级' NHibernate .字节码。春天。代理工厂工厂,NHibernate .字节码。春天/房产
属性名='连接。“释放模式”on _ close/property
映射程序集='富利.实体'/
/会话-工厂
/休眠-配置
4. 编写NHibernateHelper辅助类
文件:NHibernateHelper.cs
使用系统;
利用富力工具。原木
使用NHibernate
使用伊比利亚人.稳频发电机(发生器)(constant frequency generator的缩写)
命名空间富丽.达尔。公共
{
公共类NHibernateHelper
{
私有静态ISessionFactory _ session工厂;
私有静态ISessionFactory会话工厂
{
得到
{
if (_sessionFactory==null)
{
定义变量配置=新配置();
配置. configure();
_sessionFactory=配置BuildSessionFactory();
}
返回_会话工厂
}
}
公共静态ISession OpenSession()
{
尝试
{
返回会议工厂.OpenSession();
}
接住(例外ex)
{
日志助手.GetInstance().WriteMessage('打开数据库失败,错误:'例如.ToString());
返回空
}
}
}
}
5. 创建数据模型
NHibernate允许直接使用普通旧清除(clear的缩写)对象(POCOs),而不用通过存储过程来直接和数据库交互。使用波科斯的一个优势在于不用绑定特定的持久化层。相比较而言,有些ORM解决方案需要特殊属性,或者是基于模型对象,这些对象又是从特定的基类中继承而来的。
在NHibernate中不用特殊的修饰就可以让对象和持久化层交互。要注意的是所有需要持久化的属性必须是虚拟的,并且要开启延迟加载,所有数据模型类中的公共方法必须是虚拟的,哪怕它们并没有包含到映射文件中。
通常来讲,最好把所有的属性都设置为虚拟的。
可以借助我的一代自动代码工具从数据表生成数据模型和对应的映射文件。
使用系统;
使用系统。集合。泛型;
命名空间富丽.实体。域
{
///摘要
///共享编码表(字典表)
////摘要
[可序列化]
公共类共享代码
{
#地区构造方法
公共共享代码()
{
m _ Id=0;
m_Category=字符串。空的;
m_Text=string .空的;
m_Value=字符串。空的;
m _ IsDefault=false
m_Description=字符串。空的;
m _ ParentId=0;
m _排序顺序=0;
}
#结束区域构造方法
#地区私有变量
私有长m _ Id
私有字符串m _类别
私有字符串m _文本
私有字符串m _值
私有bool m _默认值
私有字符串m _描述
private long m _ ParentId
私有短m _排序顺序
#结束区域私有变量
#地区公有属性
///摘要
///主键身份
////摘要
公共虚拟长身份
{
获取{ return m _ Id}
设置{ m _ Id=value}
}
///摘要
///分类
////摘要
公共虚拟字符串类别
{
获取{ return m _ Category}
设置{ m _ Category=value}
}
///摘要
///文本
////摘要
公共虚拟字符串文本
{
获取{ return m _ Text}
设置{ m _ Text=value}
}
///摘要
///编码值
////摘要
公共虚拟字符串值
{
get { return m _ Value}
设置{ m _ Value=value}
}
///摘要
///是否是同类里默认
////摘要
公共虚拟弯曲件是默认的
{
get { return m _ IsDefault}
set { m _ IsDefault=value}
}
///摘要
///描述
////摘要
公共虚拟字符串描述
{
获取{ return m _ Description}
设置{ m _ Description=value}
}
///摘要
///父级Id(如果有)
////摘要
公共虚拟长ParentId
{
get { return m _ ParentId}
设置{ m _ ParentId=value}
}
///摘要
///排列次序
////摘要
公共虚拟短排序
{
get { return m _ SortOrder}
设置{ m _ SortOrder=value}
}
#结束区域公有属性
#地区扩展属性
#结束区域扩展属性
#区域重写等于和哈希码
///摘要
///
////摘要
公共覆盖布尔等于(对象对象)
{
如果(this==obj)返回真实的
if((obj==null) || (obj .GetType()!=GetType()))返回错误的
共享代码cas obj=(共享代码)obj;
return(cas obj!=null)(m _ Id==cas obj .id);
}
///摘要
///用唯一值实现GetHashCode
////摘要
公共重写int GetHashCode()
{
int hash=57
哈希=27 *哈希* m_Id .get hashcode();
返回哈希;
}
#结束区域重写等于和哈希码
}
}
6. 创建NHibernate映射文件
Nhibernate使用可扩展标记语言映射文件来映射少到数据库对象。虽然在很多案例中这可能是一对一关系,但这并不是必定的。
文件:SharedCode.hbm.xml
?可扩展标记语言版本='1.0 '编码='utf-8 '?
冬眠映射xmlns=' urn:nhibernate-mapping-2.2 '
class name='Fuli .实体。Domain.SharedCode,富利。"实体"表="共享代码"
Id name=' Id ' column=' Id ' type=' int 64 '未保存-value='0 '
生成器class='native'/
/id
属性名称='类别'类型='字符串'列='类别'/
属性名称='文本'类型='字符串'列='Text'/
属性名称='值'类型='字符串'列='值'/
属性名称='IsDefault '类型='布尔型'列='IsDefault'/
属性名称='描述'类型='字符串'列='描述'/
property name=' ParentId ' type=' int 64 ' column=' ParentId '/
属性名='排序顺序'类型=' int 16 '列='排序顺序'/
/类别
/休眠-映射
在休眠-映射标签中,同时引用类集(POCOs)所属的程序集命名空间。
班级元素表示到单个少的映射姓名。表示上面的程序集和命名空间中的类名,表格属性告诉NHibernate数据库中的哪个表或者视图将被映射。
身份证明(识别)元素告诉NHibernate哪个数据库的字段和对应的对象作为一个唯一键来使用。在本例中,我们使用身份这个字段。
发电机元素告诉NHibernate怎样给新实体来创建唯一身份证。
财产标签是见得最多的标签。它简单地映射一个到数据表或者视图中对应字段的映射。
一旦可扩展标记语言文件创建好了,需要更改可扩展标记语言的生成方式确保它被设置为嵌入式资源,否则NHibernate不会读取这个可扩展标记语言文件,那么映射就不会生效了。
图2映射文件必须是嵌入的资源
7. 使用 NHibernate连接数据库
文件:公共存储库
命名空间富丽.达尔。SQLServerImpl
{
公共类公共存储库:I公共存储库
{
#地区新增
///摘要
///新增实体表
////摘要
///param name='obj'/param
///返回/返回
public long AddNewEntityT(object obj,string tableName)其中t:新建()
{
长id=0;
尝试
{
使用(I session session=NHibernateHelper .OpenSession())
{
id=long .解析(会话。保存目标.ToString());
会话flush();
}
}
接住(例外ex)
{
日志助手.GetInstance().写消息(表名操作类型.逗号例如.ToString());
}
返回id;
}
///摘要
///新增实体表
////摘要
///param name='entity'/param
///返回/返回
公共TReturn AddNewEntityTEntity,TReturn(对象实体,字符串表名)其中TEntity:新()
{
TReturn返回值=default(TReturn);
尝试
{
使用(I session session=NHibernateHelper .OpenSession())
{
对象返回对象=会话。保存(实体);
if (returnObject!=空)
{
returnValue=(TReturn)Convert .ChangeType(returnObject,type of(TReturn));
}
会话flush();
}
}
接住(例外ex)
{
日志助手.GetInstance().写消息(表名操作类型.逗号例如.ToString());
}
返回返回值
}
#结束区域新增
}
}
对于不同的实体,可以一对一地写一个实体仓库,专注负责相对应的实体操作。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。