web-dev-qa-db-fra.com

nHibernate, aucune ligne avec l'identifiant donné n'existe

J'ai une cartographie dans le sens de cela.

<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>

Maintenant, dans la base de données, le champ field_id dans la table mdm_field a parfois une valeur qui n'existe pas dans la table key_field associée, il est donc fondamentalement brisé l'intégrité référentielle. Pour cette raison, lorsque je charge l'entité, j'obtiens une erreur "Aucune ligne avec l'identifiant donné n'existe". Comment configurer le mappage pour fonctionner avec cette situation afin qu'il ne meure pas dans cette situation.

49
Craig

Ok, j'ai trouvé la réponse. Ajouter le

not-found="ignore"

attribut à la propriété KeyField:

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

Dans mon cas, le problème était dû au fait qu'une contrainte de clé étrangère n'était pas appliquée par le moteur MyISAM et qu'une des lignes finissait donc par pointer vers une valeur inexistante et le proxy lançait une exception. Je recommanderais de vérifier que votre ensemble de données est cohérent dans ce cas.

5
Shagglez

Essayez ça ...

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