1. 学习目的
学习Nhibernate基础知识。掌握Nhibernate的配置方法,实现对单表的简单操作,如:创建表,查询,添加,删除,修改。
2. 开发环境+前期准备
开发环境: windows 2003,Visual studio .Net 2005,Sql server 2005 developer edition
前期准备: Nhibernate框架,我用的目前最新版NHibernate-1.2.0.CR1, 下载地址: http://downloads.sourceforge.net/nhibernate/NHibernate-1.2.0.CR1.msi?modtime=1172161735&big_mirror=0
3. 开发步骤:
1).双击下载下来的NHibernate-1.2.0.CR1.msi,将其安装到某个目录,我的目录为: E:\download project\orm\nhibernate.,打开该目录,即可以看到bin,doc,src三个子目录,分别为Realse好的dll或者exe目录,文档说明目录,和源程序目录.
2).打开visual studio 2005,创建类库项目NhibernateSample1
3).在解决方案管理其中,右键点击引用-添加引用,在选项卡种选择浏览,设定查找范围为:E:\download project\orm\nhibernate\bin,添加对Nhibernate.dll,log4net.dll, Iesi.Collections, HashCodeProvider四个dll的引用.
4).打开SQL Server Management Studio,创建数据库nhibernate。
5).在解决方案管理器中添加hibernate.cfg.xml文件。将下面代码粘贴到此文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory name="NHibernate.Test">
<!-- properties -->
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">Server=127.0.0.1;initial catalog=nhibernate;uid=sa;pwd=123;</property>
<property name="show_sql">false</property>
<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
<property name="use_outer_join">true</property>
<!-- mapping files -->
<mapping assembly="NhibernateSample1" />
</session-factory>
</hibernate-configuration>

该文件是Nhibernate的配置文件,其中connection.connection_string为数据库连接字符串,Dialect项因为我用的是SQL2005,所以为:MsSql2005Dialect注意:<mapping assembly=”NhibernateSample1”/>表示映射NhibernateSample1程序集下的所有类,所以以后不要需要Configuration.AddClass(..)了;
6).添加类文件:User.cs,添加代码:
using System;
using System.Collections.Generic;
using System.Text;

namespace NhibernateSample1


{
public class User

{
private int _id;
private string _name;
private string _pwd;

/**//// <summary>
/// 编号
/// </summary>
public virtual int Id

{
get

{
return _id;
}
set

{
_id = value;
}
}


/**//// <summary>
/// 名称
/// </summary>
public virtual string Name

{
get

{
return _name;
}
set

{
_name = value;
}
}


/**//// <summary>
/// 密码
/// </summary>
public virtual string Pwd

{
get

{
return _pwd;
}
set

{
_pwd = value;
}
}
}
}

6).编写User类的映射配置文件:User.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="NhibernateSample1.User,NhibernateSample1" table="Users" lazy="false">
<id name="Id" column="Id" unsaved-value="0">
<generator class="native" />
</id>
<property name="Name" column="Name" type="string" length="64" not-null="true" unique="true"></property>
<property name="Pwd" column="Pwd" type="string" length="64" not-null="true"></property>
</class>
</hibernate-mapping>
注意:该映射文件的属性中的生成操作必须为:嵌入的资源.
7).编写管理ISession对象的辅助类: NHibernateHelper.cs,代码为:
posted @ 2007-03-21 22:51
Robin Zhang 阅读(15013)
评论(59) 编辑 收藏 网摘 所属分类:
ORM
发表评论
nhibernate我用的是封装他的castleproject的activerecord,感觉也是很方便。不过感觉效率方面没有nbear好
#3楼[
楼主]2007-03-21 23:14 |
@JesseZhao
我原来也用Nbear,不过最近对Nhibernate源码感兴趣,所以准备系统学习一下
对NHibernate的性能一直持谨慎态度....
#9楼[
楼主]2007-03-22 09:02 |
@补丁
性能和扩展就像天平的两端。Nhibernate能实现这样强大的功能,肯定依赖于反射,性能肯定没有Ado.Net好,但是不是所有的系统都要求性能,性能也不单纯的依赖于数据访问方式,更适合分布的系统才真正有价值,所以有人喜欢数据表的横向切割-数据表分区镜像。这些在常理看来都是浪费性能的做法,但是如果数据达到一定量的时候,这相反会提高性能。因为这样,只要我增加服务器就能解决问题。
@zhuweisky
恐怕这里的人更喜欢用开源的产品
@jillzhang
相对于NHibernate提供的功能和扩展性,我对其性能真的是不满意
大道理大家都明白,用到实际中,很多条件制约了框架的选择
看看NBear的性能,再看看NHibernate...
NHibernate性能不会有问题,关键是如何去做,如何去实现。反射难道是问题吗?只要你不要一直去反射。就是数据库连接一样。如果没有连接池,代价不是一样很大。
Ado vNext 一样也用反射。反射不会是问题。
#16楼[
楼主]2007-03-22 13:04 |
这个问题可谓是耿古不变的争论话题。一句话,看业务需求。
代码好多呀,比我自己写的代码多多了。
八个配置文件xml的是要手动去写吗?太麻烦了呀,100多个表怎么办呀?
反射不是性能的原因。
用MyGeneration生成XML文件
#19楼[
楼主]2007-03-22 14:21 |
最近这么多人做广告。BS
感觉和Java的Hibernate没什么区别,配制文件太麻烦,限制太多,还是谨慎着用
我的试了一下,出这个错误Unknown entity class: DAL.User
不能识别实体类。为什么?
请问
我想用三层结构,
我持久类user和User.hbm.xml放在model里,将hibernate.cfg.xml和其它类放在DAL里。
出错了这个错误Unknown entity class: Model.User 不能识别实体类。
请问我应该怎么做?
#25楼[
楼主]2007-03-23 17:56 |
@harry
你的hinernate.cfg.xml中有<mapping assembly="Model" />么 ?
没有加上或者在初始化Configuration后cfg.AddClass(..);
#26楼[
楼主]2007-03-24 09:43 |
@harry
还有注意你的hbm.xml映射文件生成类型必须为嵌入的资源
@jillzhang
你好。我的hinernate.cfg.xml是这样的
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory name="NHibernate.Test">
<!-- properties -->
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">Server=127.0.0.1;initial catalog=test;uid=sa;pwd=123456;</property>
<property name="show_sql">true</property>
<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
<property name="use_outer_join">true</property>
<!-- mapping files -->
<mapping assembly="Model" />
</session-factory>
</hibernate-configuration>
hbm.xml映射文件生成类型也是嵌入的资源
但好像还是不可以!
请问一下,我的程序可以更新,删除,却不能插入,错误提示:
could not insert: [DAL.Inventory][SQL: INSERT INTO Inventory (Qty) VALUES (?)]
显示出了插入的值是空值,但是映射的对象的属性是存在值的,为什么生成sql语句时,值就变空了呢?
我用的1.2版
#29楼[
楼主]2007-04-04 16:36 |
@新手
是不是映射文件有问题?
还是不错的 正好我们要根据业务需要判断持久层的处理方案
#31楼[
楼主]2007-04-06 20:27 |
@啊啊
赫赫,多谢支持
lz你好:
我安装好工具,在目录文件夹找不到D:\NHibernate\bin\net-2.0\HashCodeProvider.dll的dll文件是什么原因啊?
#33楼[
楼主]2007-04-09 15:40 |
@追鱼
在nhibernate安装文件夹的bin目录里面有此dll
是非常感谢LZ,通过这个简单的实例,让我初步知道是咋个回事了!
谢谢
@追鱼
目录文件夹 D:\NHibernate\bin\net-1.1\HashCodeProvider.dll
这个引用也是可以的!
请问这个命名空间有什么用?using NHibernate.Tool.hbm2ddl;
#36楼[
楼主]2007-04-16 20:43 |
@JAMES
new SchemaExport(cfg).Create(true, true);
用
我在win2003,sql server2000,vs2003下
配置写在 web.config中,
当执行 sessionFactory = new Configuration().Configure().BuildSessionFactory();发生了下面的错误,
希望抽空帮忙解决一下
邮箱:qiehuaiyan@163.com
先谢了!
未处理的“NHibernate.HibernateException”类型的异常出现在 nhibernate.dll 中。
其他信息: problem parsing configuration : System.Xml.Schema.XmlSchemaException: 元素“urn:nhibernate-configuration-2.2:hibernate-configuration”有无效的子元素“urn:nhibernate-configuration-2.2:sesion-factory”。应为“urn:nhibernate-configuration-2.2:session-factory”。 , (1, 68)处发生了错误。
at System.Xml.XmlValidatingReader.InternalValidationCallback(Object sender, ValidationEventArgs e)
at System.Xml.Schema.Validator.SendValidationEvent(XmlSchemaException e, XmlSeverityType severity)
at System.Xml.Schema.Validator.SendValidationEvent(XmlSchemaException e)
at System.Xml.Schema.Validator.ValidateElementContent(XmlNodeType nodeType)
at System.Xml.Schema.Validator.Validate()
at System.Xml.Schema.Validator.Validate(ValidationType valType)
at System.Xml.XmlValidatingReader.ReadWithCollectTextToken()
at System.Xml.XmlValidatingReader.Read()
at System.Xml.XmlLoader.LoadCurrentNode()
at System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc)
at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace)
at System.Xml.XmlDocument.Load(XmlReader reader)
at NHibernate.Cfg.Configuration.Configure(XmlTextReader reader)
各位兄弟有遇到过 flush during cascade is dangerous 这个错误吗?我qq: 190410824 邮箱 :tanyuanzhen@126.com有遇到过一起讨论
博主同志
本人最近关心ORM的东西
不过一直有个疑惑
在.net中要这个东西干吗?
今天早上发了个感慨贴,不过估计是要遭ORM前辈扁的。
没办法,冒死到这里来请教一下。
请问这是什么原因:
测试方法 TestProject1.UnitTest1.TestMethod3 引发异常: NHibernate.ObjectNotFoundException: No row with the given identifier exists: 0, of class: NhibernateSample1.User。
还有这个
Assert.IsTrue 失败。
初学这个郁闷ING 望不吝赐教
#43楼[
楼主]2007-11-27 08:31 |
@wbb
必须安装nunit才能单元测试
在NHibernate中能不能执行数据库存储过程?
如果数据库结构改变了,这个框架如何应对?
新手,希望楼主不吝赐教!
#45楼[
楼主]2008-01-18 09:30 |
@不够谦虚
数据库结构变化?
ORM是O在前,你提出这个问题,还是没能理解ORM的目的,
ORM是让系统面向对象,而不是面向关系数据库
数据库更改的前提是对象实体有更改,此时更改映射文件可以解决你说的问题
博主,我按照你文章上面的例子写了一短程序,但是就是不能在数据库上建立表,但是下载下来你的程序却可以建立User表。不知道为什么我的不行,我测试了一下:数据库连接正常,希望博主能够解答,谢谢!
我晕..我得也不行.错误和@harry一样..怎么解决
请教个问题,能不能介绍从数据库生成持久层的一些工具和使用方法
能帮我调试一个简单的用asp+hibernet做的添加案例
QQ:595465394 邮箱:wangjixiang00@126.com
Robin 你好!
错误信息:
测试方法 TestProject1.UnitTest1.TestMethod2 引发异常: NHibernate.ADOException: cannot open connection ---> System.Data.SqlClient.SqlException: 在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: SQL 网络接口, error: 26 - 定位指定的服务器/实例时出错)。
我用的是vs2008 和SQL Server 2005 Express。
谢谢,我的邮箱是yueweipeng@gmail.com
#42楼 2007-11-26 22:10 | wbb [未注册用户] 请问这是什么原因:
测试方法 TestProject1.UnitTest1.TestMethod3 引发异常: NHibernate.ObjectNotFoundException: No row with the given identifier exists: 0, of class: NhibernateSample1.User。
还有这个
Assert.IsTrue 失败。
初学这个郁闷ING 望不吝赐教
#43楼 [楼主]2007-11-27 08:31 | jillzhang @wbb
必须安装nunit才能单元测试
(我装上了nunit之后还是提示相同的问题,谢谢楼主~~~)