今天开发的时候又遇到一个极其奇怪的问题,本人使用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下面,这样在写这些文件的时候就方便多了。
又小小的升了点经验值了,希望能早日长段。^_^