J'essaie de mettre à jour une entité existante.
J'ai le code suivant: p> mais le 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. P>
blockQuote> Comment puis-je résoudre ce problème? p> p> joindre code> méthodes jette un Exception: P>
6 Réponses :
On dirait que vous avez une relation avec le champ de clé étranger et une propriété de navigation dans l'élément code> 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 thanissant pour tenter de sauvegarder. Assurez-vous de modifier la relation aux deux extrémités et de marquer toutes les entités affectées comme
modifié code> avant d'appeler
SAVECHANGES code>. P>
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 code> 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é code> 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?
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: p> Vous pouvez ajouter l'utilisation de System.Data pour éviter le besoin de l'écrire Tout le temps. p> 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. P> p>
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é. P>
L'exception a été lancée lors de l'appelant 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 iobjectcontexttadapter.ObjectContext.attachto (entitésetName, entité) code> 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 code> avait une valeur, mais
o.item code> était null). Les circonstances spécifiques ne permettent pas
o.item code> à charger. P>
iquéryable.asnotracking () code> dans cette méthode. P>
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 p>
Merci! Cela corrigé mon problème.
permet de dire que vous avez le schéma suivant:
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(); } } }
Cela pourrait être un ancien poste, mais les suivants ont fonctionné pour moi p>
Définissez l'option sauvegardes code> sur
sauvegardeOption.detectchangesbeforefore code> p>