折腾了一天,NHibernate1.2在VS2005下的配置,终于通了,做个简单的备忘吧,以防以后再走弯路。
1、首先,我使用的是单独的配置文件hibernate.cfg.xml,我觉得这样更合理些,比较把那些配置都放在Web.config里更合理点吧,文件内容是这样的:
<?xml version="1.0" encoding="utf-8" ?>
<!--普通配置文件,使用程序集加载映射文件-->
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.0">
<session-factory name="NHData">
<!-- 属性 -->
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">server=.;database=user;uid=sa;pwd=5678;</property>
<property name="show_sql">false</property>
<property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property>
<property name="use_outer_join">true</property>
<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
<!-- 映射文件 -->
<!--程序将加载NHTest命名空间所有的映射文件(*.hbm.xml)-->
<mapping assembly="NHData" />
</session-factory>
</hibernate-configuration>
2、接下来是类文件和XML映射文件,我新建了一个类库项目NHData,在这里放了一个User.cs和User.hbm.xml,注意这个XML的扩展名呀,我一开始就弄个User.xml,当然不对了,
User.cs:
public class User
{
public User()
{}
private int m_Id;
public int Id
{
get { return m_Id; }
set { m_Id = value; }
}
private string m_UserName;
public string UserName
{
get { return m_UserName; }
set { m_UserName = value; }
}
private string m_Password;
public string Password
{
get { return m_Password; }
set { m_Password = value; }
}
private string m_Email;
public string Email
{
get { return m_Email; }
set { m_Email = value; }
}
}
User.hbm.xml:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0" default-lazy="false">
<class name="NHData.User,NHData" table="users">
<id name="Id" type="Int32">
<generator class="identity" />
</id>
<property name="UserName" type="String"/>
<property name="Password" type="String"/>
<property name="Email" type="String"/>
</class>
</hibernate-mapping>
这个XML的内容得好好说说,在这耽误了太多时间了,
首先,在这个版本的配置下(NHibernate1.2 VS vs2005),要加 default-lazy="false"这个个东东;
另外,注意这一行
<class name="NHData.User,NHData" table="users">
中的name,逗号前面表示的是XXX类,后面表示的是程序集的名字,问题是这样出来的,我在NHData下又建了一个文件夹Data,原想是专用于放置这个类文件和映射文件的,所以就把这一行写成了
<class name="NHData.Data.User,NHData.Data" table="users">,看看,好像没错呀,就为这个,找了一个多小时,最后,改成了这样
<class name="NHData.Data.User,NHData" table="users">
才好了,为什么,为什么前面用指明Data后面不用,后来才明白呀,前面,表示的是User类,完整的引用当然是NHData.Data.User了,而后面呢,表示的是程序集的名字,注意,是“程序集”,其实在建了NHData这个项目后,它下面的所有类,程序集就都是NHData了,所以,后面只能是NHData,不能是NHData了
最后,还要注意,这个XML文件要把属性设置成“嵌入的资源”。
3、看一下调用的方法
Configuration cfg = new Configuration().Configure();
ISessionFactory factory = cfg.BuildSessionFactory();
ISession session = factory.OpenSession();
User user;
try
{
user = session.Load(typeof(User), id) as User;
}
4、注意了,我把hibernate.cfg.xml放在网站的根目录下了,别忘了,这是XML文件,用户是可以直接下载的,要是哪天真给我下了去,那database=user;uid=sa;pwd=5678。。。。全完了!!,所以,把它改个名字hibernate.config,这样就保险了,但这句话要改一下
Configuration cfg = new Configuration().Configure();
要改成
Configuration cfg = new Configuration().Configure("文件绝对地址(Server.Mappath......)");
这里只是一个简单的总结,其实都是从DDL上学来的,呵呵,详细的去那里看吧