2012-01-29 50 views
1

我在每个我有相同的主列名(“ID”)独特的名字

我从NHibernate的得到错误数据库表:

System.IndexOutOfRangeException : An SqlCeParameter with 
ParameterIndex '5' is not contained by this SqlCeParameterCollection 

当我改变这些列名唯一名字,一切都好。

但我不知道如何解决它没有名称的变化。我只是想在每个表中使用相同的名称。

<class name="AppSignature" table="app_signatures" lazy="true"> 
    <id name="Id"><generator class="guid"></generator></id> 

    </class> 

    <class name="AppState" table="app_states" lazy="true"> 
    <id name="Id"><generator class="guid"></generator></id> 

    <many-to-one name="app_signature" 
       class="AppSignature"     
       column="Id" 
       foreign-key="id_fom_app_signature" 
       not-null="true"     
       >   
    </many-to-one> 

    </class> 

回答

2

多对一关系表示一个AppState实例最多可以分配给一个AppSignature实例。向AppSignature分配任意数量的AppState实例。该关系作为从app_states表到app_signatures表的外键实现。 “多对一”元素中的“列”属性确定存储外键值的列名称。向Id列映射两个AppState成员:Id和app_signature,这在NH中是不可能的,并导致所描述的异常。 解决方法是简单的:

<many-to-one name="app_signature" 
      class="AppSignature"     
      column="app_signature_id" 
      foreign-key="id_fom_app_signature" 
      not-null="true"     
      >   
</many-to-one> 

实现外键列的名称更改为一个唯一的名字: “app_signature_id”。现在app_signature成员映射到指向app_signatures.Id列的AppState.app_signature_id列

但是,所描述的异常应该消失(如果新列已正确添加到app_signatures表中),它并不一定是您真正想要的。 AppState和AppSignature之间的关系可以是一对一的。这意味着AppState instnace可以分配给单个AppSignature instnance,反之亦然。这种关系可以通过同一列上的主键和外键来实现。关于一对一关系有一个很好的article

+0

我得到与流利nhib相同的错误 - 你有任何想法如何解决? – 2013-04-08 21:51:49