7
votes

Une violation de la contrainte d'intégrité référentielle s'est produite

J'essaie de mettre à jour une entité existante.

J'ai le code suivant: xxx

mais le joindre méthodes jette un Exception:

Une violation de la contrainte d'intégrité référentielle s'est produite: les valeurs de propriété qui définissent les contraintes de référence ne sont pas cohérentes entre des objets principaux et dépendants dans la relation.

Comment puis-je résoudre ce problème?


0 commentaires

6 Réponses :


8
votes

On dirait que vous avez une relation avec le champ de clé étranger et une propriété de navigation dans l'élément et ces champs ont des valeurs contradictoires. Cela se produit lorsque vous chargez une entité et ses entités associées, modifiez la relation à une extrémité, ne marque que cette extrémité sous forme modifiée modifié avant d'appeler SAVECHANGES .


4 commentaires

Un moyen facile de biler le drapeau modifié?


Dans les cas normaux, EF suit les changements par elle-même et vous pouvez simplement appeler SAVECHANGES sans régler manuellement le drapeau. Dans un scénario déconnecté, il n'y a pas de moyen simple, mais vous devrez le marquer manuellement comme modifié.


J'ai reçu cette erreur même si autodétectchangeSenActivé a été défini sur true. Je n'avais pas besoin des entités associées, donc je ne les ai pas chargées et que cela a résolu la question.


Oui mais comment changez-vous des deux extrémités sans désactiver le suivi?



4
votes

Quelle est la définition de l'objet d'élément? Il semble que dans certaines de ses collections qui fixent la mèner avec d'autres entités existent un type de conflit. Vous pouvez essayer d'effacer toutes les collections pour voir si le problème persiste, mais dans ce cas, vous avez perdu l'affectation de la clé étrangère. Mais peut-être pourrait-il vous aider à localiser le problème.

Cela pourrait être un pourboire. Lorsque j'essaie d'attacher une entité existante au contexte, j'utilise pour effectuer les éléments suivants: xxx

Vous pouvez ajouter l'utilisation de System.Data pour éviter le besoin de l'écrire Tout le temps.

Ceci attache l'entité de l'état que vous souhaitez, modifié dans ce cas et suivez les modifications. Ceci est une ligne au lieu de deux.


0 commentaires

5
votes

J'ai rencontré cette exception sous un ensemble de circonstances différent et je pose ici que cette question se présente lorsque le message d'erreur est recherché.

L'exception a été lancée lors de l'appelant iobjectcontexttadapter.ObjectContext.attachto (entitésetName, entité) avec une entité partiellement chargée. Les clés étrangères de l'entité ont été définies, mais les propriétés de navigation n'étaient pas chargées. (C'est-à-dire que o.itemid avait une valeur, mais o.item était null). Les circonstances spécifiques ne permettent pas o.item à charger.

Le problème est devenu que le gestionnaire d'état d'objet avait chargé l'objet dans une méthode distincte et suivait déjà l'objet défini avec les mêmes clés. Étant donné que la méthode distincte n'avait pas besoin de suivre l'état de l'objet, la question a été résolue en appelant iquéryable.asnotracking () dans cette méthode.


0 commentaires

3
votes

Le problème pour moi était que l'entité framework avait chargé mon objet dans plusieurs endroits, alors quand j'ai mis à jour une clé étrangère, il y avait maintenant deux références au même objet, une avec une clé étrangère qui pointe d'enregistrer une et une Touche étrangère pointant vers l'enregistrement B, ce qui a provoqué une erreur puisque ma relation est une à une. Pour résoudre le problème, j'ai utilisé contexte.Entry (objet) .state = entitystate.détached, rechargé, rechargée de l'objet, a rendu le changement de clé étrangère, puis a sauvegardé mes modifications


1 commentaires

Merci! Cela corrigé mon problème.



0
votes

permet de dire que vous avez le schéma suivant: schéma

Si vous souhaitez modifier le courant actuel, vous devez également modifier l'objet actuelCocation incorporé dans l'objet Personal. EF remplira automatiquement l'objet actuelLocation, car CurrentLocollationId a une clé étrangère dans la table de l'actualisation. Lorsque vous modifiez le courant actuel sans mettre à jour l'objet actuelLocation également, ils sont hors de synchronisation. C'est ce qui cause l'exception dans ce cas. P>

Disons que vous devons avoir besoin de mettre à jour le courant actuel de l'objet de la personne. Nous supposerons que vous avez pré-archivé les données de la personne et les données de localisation. P>

public class DbData 
{
    List<Person> PersonList;
    List<Location> LocationList;
    public DbData()
    {
        using (var context = new MyContext())
        {
             PersonList = context.Persons.ToList();
             LocationList = context.Locations.ToList();
        }
    }

    public void UpdatePersonLocation(Person person, int newLocationId)
    {
        using (var context = new MyContext())
        {
            var location = LocationList.Where(l=>l.id==newLocationId).Single();
            //you need to update both the id and the location for this to not throw the exception
            person.CurrentLocationId == newLocationId;
            person.CurrentLocation == location;  
            context.Entry(person).State = System.Data.Entity.EntityState.Modified;
            context.SaveChanges();
        }
    }
    //or if you're giving it the location object...
    public void UpdatePersonLocation(Person person, Location location)
    {
        using (var context = new MyContext())
        {
            //you need to update both the id and the location for this to not throw the exception
            person.CurrentLocationId == location.id;
            person.CurrentLocation == location;  
            context.Entry(person).State = System.Data.Entity.EntityState.Modified;
            context.SaveChanges();
        }
    }
}


0 commentaires

0
votes

Cela pourrait être un ancien poste, mais les suivants ont fonctionné pour moi

Définissez l'option sauvegardes sur sauvegardeOption.detectchangesbeforefore


0 commentaires