Entity Framework: Une contrainte d'intégrité référentielle violation sur de nombreux de nombreux de la relation
Hey j'ai une application avec un tas de inproc la mise en cache et entity framework. Quand je veux écrire une mise à jour d'une entité, je rattacher la copie mise en cache. J'ai suivi toutes les choses que j'ai joint dans le cycle de vie du contexte, de sorte que je ne cherche pas à les joindre deux fois.
J'ai une erreur qui se produit sur joindre (très rarement dans la plupart des cas, cela fonctionne très bien et est très rapide) où il est dit ce qui suit:
Une contrainte d'intégrité référentielle violation a eu lieu: La propriété
les valeurs qui définissent les contraintes référentielles ne sont pas compatibles
entre le principal et les objets qui en dépendent dans la relation.
J'ai pris vraiment soin de regarder l'entité qui semble normal. Je pense que ce problème est dû à l'attachement/détachement d'une clé étrangère lorsque les corrections s'exécute.
Est-il un bon moyen d'obtenir plus d'informations sur cette erreur, ou peut-il se produire pour des raisons autres que l'entité était dans un état qui EF ne m'attendais?
EDIT:
DB Diagramme (remarque je suis en utilisant codefirst j'ai simplement utilisé l'EDMX un outil pour faire le schéma, j'ai aussi coupé une bande de propriétés du modèle pour des raisons de simplicité)
- Êtes-vous à l'aide de code de la première ou le premier modèle - et plus d'infos sur le modèle que vous avez, tables/classes qui se rapportent à l'erreur et comment la plusieurs-à-plusieurs mappé. Dans le cas où vous êtes en utilisant le premier code, je préfère faire la relation "manuellement" pour que je puisse contrôler tous les aspects et éviter ce genre de choses. De l'autre côté, erreur d'intégrité référentielle est susceptible de dire que je ne pense pas que c'est l'état de l'objet, bien qu'il pourrait se manifester de la même façon, je suppose.
- Im en utilisant CodeFirst, mon modèle est vraiment simple, ill après un diagramme dans un sec
- Luc, pouvez-vous donner le CF partie, comment voulez-vous carte les choses - comment faire de votre modèle de classes ressemblent, les migrations de code? Pour être en mesure d'aider avec cela.
Vous devez vous connecter pour publier un commentaire.
L'erreur peut se produire pour de un-à-plusieurs relations entre
Person
etLocation
apparemment vous avez dans votre modèle, en plus de plusieurs-à-plusieurs relations. Par exemple, le code suivant devrait jeter l'exception:"La propriété des valeurs qui définissent les contraintes référentielles" sont la propriété de clé étrangère de la valeur
CurrentLocationId
et la valeur de la clé primaireCurrentLocation.Id
. Si ces valeurs sont différentes de l'exception est levée. (AvoirCurrentLocation
commenull
est bien autorisé.)À mon avis, cette exception ne peut être levée pour les associations de clé étrangère parce que pour ce type d'association, vous avez des propriétés qui définissent des contraintes référentielles à tous de votre modèle. Il ne peut pas être jetés par des associations indépendantes. Depuis tous les plusieurs-à-plusieurs relation est une association indépendante (pas de clé étrangère de la propriété dans le modèle) ma conjecture est que l'erreur n'est pas lié à la votre plusieurs-à-plusieurs relations, mais à l'un-à-plusieurs.
Location
s à laPerson
s (compte tenu de laLocation
s Id)? Dans mon scénario, il est un beaucoup de beaucoup de problème. Quelle est la solution générale de cette exception, comment la contourner?null
(qui, je le ferais dans ce cas) ou de s'assurer que FK valeur de la propriété et de la valeur de clé primaire de l'entité de la propriété de navigation sont les mêmes. Mais dans ma compréhension de cette exception ne peut pas se produire pour plusieurs-à-plusieurs liens. C'est une exception liée à FK associations et plusieurs-à-plusieurs liens sont des associations indépendantes, pas de FK associations.Category
s etBusiness
. Chaque entreprise peut avoir plusieursCategory
s. J'ai une liste de la Catégorie Id je veux joindre, comment dois-je faire?new Category { Id = id }
), pour les fixer sur le contexte, les ajouter à laBusiness.Categories
de collecte et d'enregistrer les modifications. Mais cela semble un peu hors de cette question et la réponse. Peut-être créer une nouvelle question pour obtenir plus ciblé des réponses.context.Categories.Attach(category)
) est de: Raconter EF que les catégories existent déjà.Je suis tombé sur une très similaires exception:
La raison a cela:
Le côté client de l'API web envoyé une demande auprès de l'ensemble de l'objet, y compris la propriété de navigation (dans cet exemple, ObjectA (plus correctement ObjectB.ObjectA) est une propriété de navigation et a été entièrement fourni par le client). Cela se produit parce que le client reçoit la totalité de l'objet à partir du serveur et rebondit comme ça sur le serveur avec des changements mineurs.
D'autre part, la ObjectB.PropertyY venait d'être changé (c'était la raison pour la METTRE demande en premier lieu).
Depuis ObjectB.PropertyY était une référence à l'objet même ObjectA (clé étrangère), EF essayé de concilier ce et a échoué avec l'exception ci-dessus.
La solution était simple:
avant la SaveChanges() résolu ce problème complètement.
J'espère que cela aide quelqu'un.
J'ai juste connu le même problème et la résolution de la mine était que j'avais ajouté des mappages de l'association, puis le programme d'installation du référentiel contstraints.
Afin de résoudre le problème que j'ai eu pour ouvrir la fenêtre mappages de l'association, et il y a un lien pour supprimer les mappages. Une fois cela fait, la Cartographie des Détails de la fenêtre, puis dit Mappages ne sont pas autorisés.. Il semble que l'ajout de la contrainte référentielle des feuilles de tous les mappages en place.
De la pensée, il peut être intéressant de poster dans le cas où quelqu'un d'autre est à la recherche de solutions à ce message d'erreur à l'avenir.
@LukeMcGregor salut,
Je pense que je peux offrir un point de vue différent, comme quelqu'un qui a le même problème.
Après j'ai effectué toutes les vérifications nécessaires, je peux dire que je préfère à obtenir cette erreur.
Parce que dans mon scénario: je voulais inclure un objet qui a causé une erreur d'incompatibilité. C'est l'emplacement de l'objet dans votre scénario. Si j'ajoute un objet avec un ID, j'obtiens ce message d'erreur parce que l'ID de l'objet précédent (celui qui n'est pas mis à jour) ne correspond pas à l'ID mis à jour.
Mais ce n'est pas un gros problème. Comme une solution; Si elle est toujours sur le côté de l'INTERFACE utilisateur, l'objet peut toujours être inclus s'il existe encore.
Vous aurez soit vide de l'objet lorsque vous recevez la mise à jour de la demande de l'utilisateur. (= Null) Ou vous mettre à jour l'objet avec l'ID mis à jour par l'utilisateur avant le côté service de mise à jour (joindre, modifiée ... peu importe) et mise à jour de cette façon.
Que c'est. Il peut rester comme il est dans la base de données et des diagrammes.
À ajouter à @Slauma réponse, il n'est pas seulement lors de l'ajout d'objets à votre contexte. Pour votre exemple, si vous modifiez l'CurrentLocationId en Personne, vous devez également modifier le CurrentLocation objet incorporé dans l'objet de Personne. EF remplira automatiquement le CurrentLocation objet, car CurrentLocationId a une clé étrangère dans la CurrentLocation de la table. Lorsque vous modifiez le CurrentLocationId sans mettre à jour le CurrentLocation objet ainsi, ils deviennent hors de la synchronisation. C'est ce qui fait l'exception dans ce cas.
Donc, disons que vous avez besoin de mettre à jour la Personne objet de la CurrentLocationId. Nous allons supposer que vous pré-extrait les données et les données de Localisation.
J'ai juste eu ce problème et est venu avec une jolie solution rapide. Mon problème est avec beaucoup beaucoup de table.
J'ai ajouté la ligne où j'ai affecté
Picture = db.Pictures...
et puis il a bien fonctionné (pas exactement pourquoi)