C# nHibernate,不存在具有给定标识符的行

C# nHibernate,不存在具有给定标识符的行,c#,nhibernate,nhibernate-mapping,C#,Nhibernate,Nhibernate Mapping,我有一个沿着这条线的映射 <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Model.Entities" schema="etl" assembly="Model" default-lazy="false"> <class name="Model.Entities.DataField, Model" table="mdm_field"> <id name="FieldId"

我有一个沿着这条线的映射

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Model.Entities" schema="etl" assembly="Model" default-lazy="false">
  <class name="Model.Entities.DataField, Model" table="mdm_field">
    <id name="FieldId" column="field_id" type="int">
      <generator class="native" />
    </id>
    <many-to-one name="KeyField" class="Model.Entities.Key, Model" column="field_id" />
  </class>
</hibernate-mapping>


现在在数据库中,mdm_字段表中的字段_id有时有一个在相关的key_字段表中不存在的值,因此它基本上破坏了引用完整性。因此,当我加载实体时,我会得到一个错误“不存在具有给定标识符的行”。如何配置映射以处理这种情况,使其不会在这种情况下消亡。

好的,我找到了答案。添加

not-found="ignore"
属性的属性
键字段

<many-to-one name="KeyField" not-found="ignore" class="Model.Entities.Key, Model" column="field_id" />

在我的例子中,问题是因为MyISAM引擎没有强制执行外键约束,因此其中一行最终指向一个不存在的值,代理引发了异常。我建议在这种情况下检查数据集是否一致。

试试

public void Override(ModelMapper modelMapper) {
    modelMapper.Class<T>(c => { 
        c.ManyToOne(m => m.FKObj, r => {
            r.Column("FKColumn");
            r.NotFound(NotFoundMode.Ignore); // THIS IS IMPORTANT!!!
        });
    });
}
public void覆盖(ModelMapper ModelMapper){
modelMapper.Class(c=>{
c、 许多酮(m=>m.FKObj,r=>{
r、 列(“FKColumn”);
r、 NotFound(NotFoundMode.Ignore);//这很重要!!!
});
});
}

我有相同的映射,你知道如何找到没有KeyField的所有模型吗?这也让我大吃一惊。对于注释,使用@NotFound(action=NotFoundAction.IGNORE)。我在Fluent NHibernate中遇到了类似的问题。泰德,如果你能指出一个合适的解决办法,我将非常感激。FWIW,将.NotFound.Ignore()放在键域上对我的情况没有任何帮助。@Ted想解释一下为什么它不是一个有效的解决方法吗?@the_Butcher Ted是正确的,因为将'not found=Ignore'放在键域上不会引发异常,但它将摆脱惰性初始化!如果您有10000个项目的列表,是否要选择10000次?除了可能不是最佳解决方案之外,这对我使用fluent NHibernate NotFound.Ignore()映射不起作用。谢谢您的回答!这实际上解决了问题,而不是解决问题。