NHibernate总结
NHibernate总结
现在的项目中数据访问使用的是NHibernate的一个ORM框架,小弟也是在后期加入项目组,之前对NHibernate就一直没有接触过,所以一直在学习NHibernate,都是一些很基础的一些东西,写出来总结一下,作为备忘。
如果你下个系统的学习NHibernate,给大家推荐一个博客,详细的介绍了NHibernate,我也是根据这篇博客学习的。请点击(http://www.cnblogs.com/lyj/archive/2008/10/10/1308267.html)
NHibernate是什么
NHibernate 是一个面向.NET 环境的对象/关系数据库映射工具。对象关系映射(O/R Mapping,Object Relational Mapping)表示一种技术,用来把对象模型表示的对象映射到基于SQL 的关系模型数据结构中去。
NHibernate不仅仅管理.NET 类到数据库表的映射(包括.NET 数据类型到SQL 数据类型的映射),还提供数据查询和获取数据的方法,大幅度减少我们开发时人工使用SQL和ADO.NET处理数据的时间。NHibernate的目标是对于开发者通常的数据持久化相关的编程任务,解放其中的95%。并请记住NHibernate作为数据库访问层,是与你的程序紧密集成的。
开始使用NHibernate
我们亲自动手,一步一步实现一个NHibernate简单程序来,我只实现了简单的增删改查功能。我使用的开发环境:Microsoft Visual Studio 2012、SQL Server 2008 、NHibernate。
1、创建项目
(1) 我们新建如下一个项目

NH.Data层为Nhibernate操作相关,其中DBConnect.cfg.xml文件为数据库连接文件(按照模板修改即可),NHData.cs包含增删改查操作,NHibernateHelper.cs封装Nhibernate底层操作,People.cs为实体类,People.hbm.xml为映射文件(把数据库表People映射到实体类People)。,其中People实体类中的字段要设置为virtual。每个文件的详细代码在下面介绍
(2) 在NH.Data层引用Nhibernate相关的DLL

2、建立数据库表

Create database Test
GO
use Test
GO
CREATE TABLE [dbo].[People]( [Id] [int] IDENTITY(1,1) primary key NOT NULL, [Name] [nvarchar](10) NULL, [Age] [int] NULL, [Sex] [nvarchar](1) NULL, ) GO

3、NH.Data类库中文件介绍
(1) DBConnect.cfg.xml数据库连接文件
我们根据模板修改一下配置信息和文件输出属性就可以了,主要就是配置连接字符串。

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">
Server=10.165.150.105;initial catalog=Test;User ID=sa;Password=Hello123
</property>
<property name="adonet.batch_size">25</property>
<property name="show_sql">true</property>
<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
<property name="use_outer_join">true</property>
<property name="command_timeout">60</property>
<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
<property name="proxyfactory.factory_class">
NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu
</property>
<mapping assembly="NH.Data"/>
</session-factory>
</hibernate-configuration>

注意:XML文件的默认“复制到输出目录”为“不复制”,这里需要修改为“始终复制”。否则出现异常。我们可以在该文件上点击右键选择属性进行修改。
(2) NHibernateHelper.cs数据操作辅助类
我们现在可以开始NHibernate了。首先,我们要从ISessionFactory中获取一个ISession(NHibernate的工作单元)。ISessionFactory可以创建并打开新的Session。一个Session代表一个单线程的单元操作。 ISessionFactory是线程安全的,很多线程可以同时访问它。ISession不是线程安全的,它代表与数据库之间的一次操作。ISession通过ISessionFactory打开,在所有的工作完成后,需要关闭。 ISessionFactory通常是个线程安全的全局对象,只需要被实例化一次。我们可以使用GoF23中的单例(Singleton)模式在程序中创建ISessionFactory。这个实例我编写了一个辅助类NHibernateHelper 用于创建ISessionFactory并配置ISessionFactory和打开一个新的Session单线程的方法,之后在每个数据操作类可以使用这个辅助类创建ISession

public class NHibernateHelper
{
private ISessionFactory _sessionFactory;
public NHibernateHelper()
{
_sessionFactory = GetSessionFactory();
}
private ISessionFactory GetSessionFactory()
{
return (new Configuration()).Configure(AppDomain.CurrentDomain.BaseDirectory + "DBConnect.cfg.xml").BuildSessionFactory();
}
public ISession GetSession()
{
return _sessionFactory.OpenSession();
}
}

(3) People.cs实体类

public class People
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual int Age { get; set; }
public virtual string Sex { get; set; }
}

注意:字段的属性一定要设置为virtual,要不然会报错
(4) 下面我们开始为People实体类进行数据库表映射配置People.hbm.xml
NHibernate要知道怎样去加载和存储持久化类的对象。这正是NHibernate映射文件发挥作用的地方。映射文件包含了对象/关系映射所需的元数据。元数据包含持久化类的声明和属性到数据库的映射。映射文件告诉NHibernate它应该访问数据库里面的哪个表及使用表里面的哪些字段。

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="NH.Data"
namespace="NH.Data">
<class name ="People" table="People" lazy="true">
<id name="Id" column ="Id" type="Int32">
<generator class ="native"/>
</id>
<property name ="Name" column="Name" type="String"/>
<property name ="Age" type="Int32" column="Age"/>
<property name ="Sex" type="String" column="Sex"/>
</class>
</hibernate-mapping>

注意:XML文件的默认生成操作为“内容”,这里需要修改为“嵌入的资源”生成,因为NHibernate是通过查找程序集中的资源文件映射实体。我们可以在People.hbm.xml点击右键选择属性修改该文件的生成操作
(5) NHData.cs对库表People进行增删改查
现在完事具备只欠东风了,开始我们的数据库CRUD操作,在看该文件的代码时,建议大家先看一下http://www.cnblogs.com/lyj/archive/2008/10/15/1312089.html这篇博客,了解一下NHibernate查询语言(HQL)。

public class NHData
{
protected ISession Session { get; set; }
public NHData()
{
Session = new NHibernateHelper().GetSession();
}
public IList<People> GetList()
{
var crit = Session.CreateCriteria(typeof(People));
return crit.List<People>();
}
//增加
public int Create(People p)
{
object value= Session.Save(p);
Session.Flush();
return Convert.ToInt32(value);
}
//根据Sql语句获取实体
public IList<People> GetListBySql()
{
return Session.CreateQuery("from People c where c.id>:id").SetString("id", "1").List<People>();
string strsql = "select * from Customer where id>2";
ISQLQuery sqlQuery = Session.CreateSQLQuery(strsql).AddEntity("Customer", typeof(People));
return sqlQuery.List<People>();
}
//获取
public People Get(int id)
{
List<ICriterion> lst = new List<ICriterion>();
lst.Add(Restrictions.Where<People>(c=>c.Id==id));
var crit = Session.CreateCriteria(typeof(People));
lst.ForEach(c => crit.Add(c));
return crit.List<People>()[0];
}
//删除
public void Delete(int id)
{
People p = Get(id);
Session.Delete(p);
Session.Flush();
}
//修改
public void Update(int id)
{
People p=Get(id);
p.Name="wer";
Session.Update(p);
Session.Flush();
}
public List<People> getList()
{
string strsql = "select * from people";
SqlConnection con = new SqlConnection(strsql);
con.Open();
SqlCommand cmd = new SqlCommand(strsql,con);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
sda.Fill(dt);
return dt.ToList<People>();
}
}

4、测试
在NHibernateSample中引用NH.Data.dll
把NH.Data中的DBConnect.cfg.xml文件copy到NHibernateSample项目中,这个问题我一直没有解决,不知道怎么解决。
新建一个default.aspx页面

protected void btnAdd_click(object sender, EventArgs e)
{
People p = new People()
{
Name = new Random().Next(99999999).ToString(),
Age = 10010,
Sex = "男"
};
data.Create(p);
IList<People> lst = data.GetList();
GridView1.DataSource = lst;
GridView1.DataBind();
}

点击这里下载源程序
每天学习一点点,每天进步一点点。
NHibernate总结的更多相关文章
- Nhibernate的Session管理
参考:http://www.cnblogs.com/renrenqq/archive/2006/08/04/467688.html 但这个方法还不能解决Session缓存问题,由于创建Session需 ...
- "NHibernate.Exceptions.GenericADOException: could not load an entity" 解决方案
今天,测试一个项目的时候,抛出了这个莫名其妙的异常,然后就开始了一天的调试之旅... 花了很长时间,没有从代码找出任何问题... 那么到底哪里出问题呢? 根据下面那段长长的错误日志: -- ::, ...
- nhibernate连接11g数据库
我框架的数据映射用 nhibernate连接多数据库,这次又增加了oracle11g,负责开发的同事始终连接不上,悲催的sharepoint调试是在不方便... 下面描述下问题的解决,细节问题有3个: ...
- 全自动迁移数据库的实现 (Fluent NHibernate, Entity Framework Core)
在开发涉及到数据库的程序时,常会遇到一开始设计的结构不能满足需求需要再添加新字段或新表的情况,这时就需要进行数据库迁移. 实现数据库迁移有很多种办法,从手动管理各个版本的ddl脚本,到实现自己的mig ...
- 跟我学习NHibernate (1)
引言:Nibernate概述 NHibernate是一个ORM框架,NHibernate是一个把C#对象世界和关系世界数据库之间联系起来的一座桥梁.NHibernate 能自动映射实体模型到数据库,所 ...
- 让OData和NHibernate结合进行动态查询
OData是一个非常灵活的RESTful API,如果要做出强大的查询API,那么OData就强烈推荐了.http://www.odata.org/ OData的特点就是可以根据传入参数动态生成Ent ...
- MVC Nhibernate 示例
首先,非常感谢提出问题的朋友们,使得本人又去深入研究了NHibernate的<Session-Per-Request 模式>. 前言: 谈到NHibernate大伙并不陌生,搞Java ...
- Nhibernate mapping 文件编写
生成工具软件 现在生成工具软件有很多了,例如商业软件:NMG.CodeSmith.Visual NHibernate,开源软件:MyGeneration.NHibernate Modeller.AjG ...
- NHibernate之映射文件配置说明
NHibernate之映射文件配置说明 1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表 ...
- NHibernate常见问题及解决方法
NHibernate常见问题及解决方法 曾经学过NHibernate的,但是自从工作到现在快一年了却从未用到过,近来要巩固一下却发现忘记了许多,一个"in expected: <end ...
随机推荐
- iOS程序发布时出现your application is being uploaded解决办法
当用Xcode发布app时候出现“your application is being uploaded”或者用Application Loader 一直出现“ 正在通过ITUNES STORE进行鉴定 ...
- perconaXTRADB Cluster在Redhat Linux上的安装
installing-perconaXTRADB Cluster 5.6 For Redhat 6.4 一.server版本号查看 Root# cat /etc/redhat-release Red ...
- C# ---- 串口数据YSI实例
原文:C# ---- 串口数据YSI实例 C#----串口数据接收发送中,发送接收数据已经可以模拟了. 本次YSI实例过程中 主要是:类型转换问题 .计算校验码 一.不同设备不同的规则,本次实例代码如 ...
- 日积月累系列之省市选择器(js源码)
省市选择器是大家经常用到的, 但网上找的省市选择器都不是很实用,于是自己写了移动端的省市选择器. 界面: 源码结构: 演示地址:http://component.cform.cn/city/ 演示二维 ...
- JAVA学习篇--Java类加载
由来: 与普通程序不同的是,Java程序(class文件)并非本地的可执行程序(解释性语言). 当执行Java程序时.首先执行JVM(Java虚拟机),然后再把Javaclass载入到JVM里头执行, ...
- ORA-00265: instance recovery required, cannot set ARCHIVELOG mode
症状: 我打开后归档命令报告运行错误ORA-00265 SQL> alter database archivelog; alter database archivelog * ERROR at ...
- CSS背景图片定位
原文:CSS背景图片定位 在网页开发中我们经常需要对图片进行分割(如下图)来使用,而不是分别提供单独的图片来调用,常见的如页面背景,按钮图标等,这样做的好处就是减少请求次数,节省时间和带宽. 对背景图 ...
- jmeter java请求
demo下载地址http://yun.baidu.com/share/link?shareid=4277735898&uk=925574576 1.引用jmeter的jar包 到jmeter的 ...
- Ajax.ActionLink 用法
Ajax.ActionLink 用法 Ajax 属性的ActionLink方法可以创建一个具有异步行为的锚标签. ActionLink方法的第一个参数指定了链接文本,第二个参数是要异步调用的操作的名称 ...
- android的EditText获取另一个焦点
在android关于开发过程EditText在setFocusable(false);后,设置时需要再次获得输入焦点setFocusable(true);问题后仍然无法获得焦点: 解决的方法: 对Ed ...