Empêcher Entity Framework d'insérer des valeurs pour les propriétés de navigation
Je suis en train de travailler sur une application WPF utilisant Entity Framework 4.0. Quand j'ai essayé d'enregistrer l'objet, j'ai eu une clé primaire exception, mais la clé primaire est un AutoIncremented domaine et je ne comprends pas la raison de l'exception.
Donc, après avoir essayé ceci et cela, et un peu de débogage et en utilisant le générateur de profils SQL, j'ai découvert qu'avant d'insérer mon objet, un dossier doit être inséré dans la table parent, que j'ai mis la propriété de navigation de l'objet.
Ainsi, le nœud si une tentative d'insérer des Employés de l'objet et de définir son ministère en tant que Salarié.Département = deptObject, un nouvel enregistrement est configuré pour être inséré sur le département de l'objet.
De bien vouloir me suggérer une certaine manière par laquelle la navigation de la propriété des objets ne sera pas inséré dans la base de données, une propriété ou une méthode quelconque, n'importe Quoi.
Grâce
source d'informationauteur manav inder
Vous devez vous connecter pour publier un commentaire.
C'est de cette façon que fonctionne les EF si vous utilisez de manière incorrecte détaché des entités. Je suppose que vous utilisez quelque chose comme ceci:
Ce code préparé des employés de l'entité, ajout d'une référence existante département et sauvé des nouveaux employés à la base de données. Où est le problème? Le problème est que
AddObject
n'ajoute pas seulement employé, mais l'ensemble de l'objet graphique. C'est comment fonctionne les EF - vous ne pouvez pas avoir un objet graphique où sont connectés les objets du contexte et du cadre de pas.AddObject
ajoute chaque objet dans le graphique comme une nouvelle (nouveau = insérer dans la base de données). Si vous devez modifier la séquence de vos opérations ou de fixer l'état des entités manuellement de sorte que votre contexte sait que le service existe déjà.Première solution - utiliser le contexte pour le chargement département et l'enregistrement de l'employé:
Deuxième solution - connecter les entités du contexte séparément et après qui font référence à d'autres entités:
Troisième solution correcte de l'état du département manuellement de sorte que le contexte n'a pas insérer de nouveau:
Je voudrais ajouter une 4ème solution en plus des 3 déjà des solutions fournies dans Ladislavs grande réponse. Dans les faits, sa version détaillée de la réponse courte de Naor. Je suis en train de travailler avec entity framework, version 6.
Attribuer le ministère de l'id de l'employé au lieu de département objet
J'ai tendance à avoir une "valeur de clé étrangère" bien, en plus de la propriété de navigation dans mes classes de modèle.
Donc sur la
Employee
classe j'ai unDepartment
de la propriété et également unDepartmentId
de type int (int nullable si il est possible qu'unEmployee
n'a pas deDepartment
):Auriez-vous pu faire maintenant, c'est juste réglage de la
DepartmentId
:Ainsi, au lieu de:
suffit de le définir:
ou
Maintenant lors de l'appel de
SaveChanges
sur l'employé ajouté, seul l'employé est enregistré et aucun nouveau département est créé. Mais la référence à partir deEmployee
àDepartment
est réglé correctement en raison de l'assignation au ministère de l'id.Plus d'infos
J'ai l'habitude d'accéder à la
Department
objet de laEmployee
classe uniquement lors de la lecture /traitement des employés.Lors de la création ou de la mise à jour des employés, je voudrais utiliser le
DepartmentId
propriété de laEmployee
classe à attribuer à.De ne pas attribuer à l'
Department
propriété de laEmployee
a un inconvénient: Elle peut faciliter le débogage plus difficile, parce que avant d'appelerSaveChanges
et relire les employés, il ne serait pas possible de voir ou d'utiliser leDepartment
objet de laEmployee
.La fixation d'état de l'entité info en EF6
Cela fait référence à Ladislavs solution numéro 3.
Avec EF6 il est fait de cette façon:
Lorsque vous définissez le ministère de l'employé - je pense que vous devriez vérifier le ministère a été récupéré à partir de la db et elle attache une entité.
En outre, vous pouvez mettre l'id de deprtment (la propriété de clé étrangère) au lieu de définir le service de navigation de la propriété.