主键中的唯一名称

时间:2012-01-29 20:52:12

标签: nhibernate

我有每个数据库表都有相同的主列名称(' 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>

1 个答案:

答案 0 :(得分:2)

多对一关系意味着可以将AppState实例最多分配给一个AppSignature实例。可以为AppSignature分配任意数量的AppState实例。此关系实现为从app_states表到app_signatures表的外键。 “many-to-one”元素中的“Column”属性确定存储外键值的列名。在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成员被映射到AppState.app_signature_id列,该列指向app_signatures.Id列

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