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-mappingxmlns="urn:nhibernate-mapping-2.2">
        <classname="MyPublisher.Entities.ModuleInfo, MyPublisher.Entities"table="`Module`">
                <idname="Id"type="String"unsaved-value="null">
                        <columnname="ModuleId"length="50"sql-type="varchar"not-null="true"unique="true"index="PK_Module"/>
                        <generatorclass="native" />
                </id>
                <propertyname="ModuleName"type="String">
                        <columnname="ModuleName"length="200"sql-type="varchar"not-null="false"/>
                </property>
                <propertyname="ModuleType"type="String">
                        <columnname="ModuleType"length="50"sql-type="varchar"not-null="false"/>
                </property>
                <propertyname="DirectionId"type="String">
                        <columnname="DirectionId"length="50"sql-type="varchar"not-null="false"/>
                </property>            
    <propertyname="IconUrl"type="String">
      <columnname="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-mappingxmlns="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下面,这样在写这些文件的时候就方便多了。
又小小的升了点经验值了,希望能早日长段。^_^

posted @ 2009-08-04 11:51  awp110  阅读(221)  评论(0编辑  收藏  举报