C# nhibernate“;XYZ的getter发生异常;

C# nhibernate“;XYZ的getter发生异常;,c#,oracle,nhibernate,C#,Oracle,Nhibernate,我是一个想进入nHibernate的新手,我过得很开心。我得到以下异常(和内部异常) Common32.ExtractionCompany.ID的getter出现异常 对象与目标类型不匹配 基本上,因为我刚刚开始,我有很多类,它们应该有另一个类的实例存储在列表中。A存储B,B存储C等。我使用guid作为键,因此在oracle11g(我的数据库)中,我使用Raw(16)作为数据类型。奇怪的是,这部分起作用。如果我把一些B对象放在a中,一切都很好。一旦我试着把C对象放到B中,一切都会中断 下面是我创

我是一个想进入nHibernate的新手,我过得很开心。我得到以下异常(和内部异常)

Common32.ExtractionCompany.ID的getter出现异常

对象与目标类型不匹配

基本上,因为我刚刚开始,我有很多类,它们应该有另一个类的实例存储在列表中。A存储B,B存储C等。我使用guid作为键,因此在oracle11g(我的数据库)中,我使用Raw(16)作为数据类型。奇怪的是,这部分起作用。如果我把一些B对象放在a中,一切都很好。一旦我试着把C对象放到B中,一切都会中断

下面是我创建目标表的SQL语句。每个表都有一个ID列作为主键,还有一个列作为返回上一个表的外键

create table ExtractionCommand 
( ID Raw(16) );

create table ExtractionCompany
( ID Raw(16),
CommandID Raw(16) );

create table ExtractionTable
( ID Raw(16),
CompanyID Raw(16) );

create table ExtractionColumn
( ID Raw(16),
TableID Raw(16) );

create table ExtractionTarget
( ID Raw(16),
ColumnID Raw(16));
这是我的课程

还有我的地图

<class name="ExtractionCommand" table="ExtractionCommand" >
<id name="ID">
  <generator class="guid" />
</id>    
<bag name="Company" cascade="all">
  <key column="CommandID" />
  <one-to-many class="ExtractionCompany"/>
</bag>
</class>

<class name="ExtractionCompany" table="ExtractionCompany" >
<id name="ID">
  <generator class="guid" />
</id>
<property name="CommandID"/>    
<bag name="Tables" cascade="all">
  <key column="CompanyID" />
  <one-to-many class="ExtractionCompany"/>
</bag>
</class>

<class name="ExtractionTable" table="ExtractionTable" >
<id name="ID">
  <generator class="guid" />
</id>
<property name="CompanyID"/>
<bag name="Columns" cascade="all">
  <key column="TableID"/>
  <one-to-many class="ExtractionColumn"/>
</bag>
</class>

<class name="ExtractionColumn" table="ExtractionColumn" >
<id name="ID">
  <generator class="guid" />
</id>
<property name="TableID" />
<one-to-one name="Target" class="ExtractionTarget"/>
</class>

<class name="ExtractionTarget" table="ExtractionTarget" >
<id name="ID">
  <generator class="guid" />
</id>
<property name="TargetTable"/>
<property name="TargetColumn"/>
</class>

非常感谢您的帮助。非常感谢。
mj

它会中断,因为您在
提取公司
映射的
一对多
部分中使用了错误的类型。您需要改用
ExtractionTable

<class name="ExtractionCompany" table="ExtractionCompany" >
<id name="ID">
  <generator class="guid" />
</id>
<property name="CommandID"/>    
<bag name="Tables" cascade="all">
  <key column="CompanyID" />
  <one-to-many class="ExtractionTable"/>
</bag>
</class>


此外:


您的类不应包含父类的ID。如果他们确实需要对父对象的引用,请添加一个具有父对象类型的属性,并将其映射为引用。

它会中断,因为您在
提取公司映射的
一对多
部分中使用了错误的类型。您需要改用
ExtractionTable

<class name="ExtractionCompany" table="ExtractionCompany" >
<id name="ID">
  <generator class="guid" />
</id>
<property name="CommandID"/>    
<bag name="Tables" cascade="all">
  <key column="CompanyID" />
  <one-to-many class="ExtractionTable"/>
</bag>
</class>


此外:


您的类不应包含父类的ID。如果他们确实需要对父对象的引用,请添加一个具有父对象类型的属性,并将其映射为引用。

好的方面。我还要提到的是,一般来说,您不应该序列化您的nhibernate实体。如果您使用的是延迟加载,那么这将不起作用。一般来说,我认为这里被接受的解决方案是使用DTO。好的方面。我还要提到的是,一般来说,您不应该序列化您的nhibernate实体。如果您使用的是延迟加载,那么这将不起作用。一般来说,我认为公认的解决方案是使用DTO。
<class name="ExtractionCompany" table="ExtractionCompany" >
<id name="ID">
  <generator class="guid" />
</id>
<property name="CommandID"/>    
<bag name="Tables" cascade="all">
  <key column="CompanyID" />
  <one-to-many class="ExtractionTable"/>
</bag>
</class>