NHibernate配置文件问题

今天开发的时候又遇到一个极其奇怪的问题,本人使用asp.net 2.0+NHibernate开发一个Publish系统,在使用NHibernate做持久层访问数据库的时候收到Exception:element was not found in the configuration file .
但是很奇怪,我都是使用的跟标准一样的配置方法啊,并且是用codesmith生成的配置文件和Persistent Class,应该不会有错啊?????
仔细观察配置文件后,发现有hibernate-mapping xlmns=”urn:nhibernate-mapping-2.0”,似乎不对,我的nhibernate的版本似乎是1.2的,那是不是应该将nhibernate-mapping改成2.2呢???先试试吧,将xlmns改成urn:hibernate-mapping-2.2,然后通过帮助文件知道要把所有的persistent class中的properties都改成virtual的。然后build,run,debug。
靠。。。。。居然还是不对,但是这个时候的错误变成了Could not compile the mapping document,应该是出了其他问题了。
怎么办呢???自己搞定吧,把NHibernate的solution找出来,编译出assembly,挂到我的项目中,然后打上断点,看看是那个该死的地方出了毛病
………….
哈哈,搞定了,原来是这样的。先来看看我原先的mapping file:
< hibernate-mapping xmlns = "urn:nhibernate-mapping-2.2">
        < class name = "MyPublisher.Entities.ModuleInfo, MyPublisher.Entities"table="`Module`">
                < id name = "Id"type="String"unsaved-value="null">
                        < column name = "ModuleId"length="50"sql-type="varchar"not-null="true"unique="true"index="PK_Module"/>
                        < generator class = "native" />
                </ id >
                < property name = "ModuleName"type="String">
                        < column name = "ModuleName"length="200"sql-type="varchar"not-null="false"/>
                </ property >
                < property name = "ModuleType"type="String">
                        < column name = "ModuleType"length="50"sql-type="varchar"not-null="false"/>
                </ property >
                < property name = "DirectionId"type="String">
                        < column name = "DirectionId"length="50"sql-type="varchar"not-null="false"/>
                </ property >            
    < property name = "IconUrl"type="String">
      < column name = "IconUrl"length="100"sql-type="varchar"not-null="false"/>
    </ property >
        </ class >
</ hibernate-mapping >
然后我发现了一个问题,在nhibernate中assembly load的时候,找的是一个叫做MyPublisher.Entities的程序集,但是我的项目中只有Entities的程序集,估计是codesmith的模板有问题,导致名字出错了,哎~~~~原来如此简单,修改class name=”MyPublisher.Entities.ModuleInfo, Entities”之后,问题解决。
在解决问题之后,通过对NHibernate的内部代码的解析,发现实际上不用把程序集写在class name里面也是可以的,可以在hibernate-mapping的时候来做:
< hibernate-mapping xmlns = "urn:nhibernate-mapping-2.2"assembly="Entities">
这样也是可以的。
还有如果想要在写配置文件或者mapping文件的时候vs IDE能够提供tips,或者code completion,可以将download下来的$nhibernate$\src\NHibernate-src\src\NHibernate(可能由于版本不同会有所变化,可以用search的办法)目录中的nhibernate-*.xsd文件copy到$.net home$\Common7\Packages\schemas\xml下面,这样在写这些文件的时候就方便多了。
又小小的升了点经验值了,希望能早日长段。^_^

你可能感兴趣的:(Hibernate)