web-dev-qa-db-ja.com

nHibernate、指定された識別子の行は存在しません

これに沿ったマッピングがあります。

<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_fieldテーブルのfield_idに、関連するkey_fieldテーブルに存在しない値が含まれる場合があるため、基本的に参照整合性が損なわれます。このため、エンティティをロードすると、「指定された識別子の行が存在しません」というエラーが表示されます。この状況で機能するようにマッピングを構成して、この状況で死なないようにする方法を教えてください。

49
Craig

わかりました、私は答えを見つけました。追加

not-found="ignore"

プロパティKeyFieldの属性:

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

私の場合の問題は、外部キー制約がMyISAMエンジンによって強制されなかったため、行の1つが存在しない値を指し示し、プロキシが例外をスローしたためでした。この場合、データセットが一貫していることを確認することをお勧めします。

5
Shagglez

やってみて...

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!!!
        });
    });
}
5
Rodolpho Brock