Entity Framework Problème EntityKey / Clé étrangère
-
06-07-2019 - |
Question
À la suite d'une publication de formulaire, j'essaie de sauvegarder un nouvel enregistrement de marque. À mon avis, le genre est une liste déroulante renvoyant un entier, qui est renseigné à partir de ViewData ("sexe").
J'ai configuré mon lien comme suit:
gID = CInt(Request.Form("Gender"))
Brand.GenderReference.EntityKey = New EntityKey("DB_ENTITIES.Gender", "Id", gID)
TryUpdateModel(Brand)
DB.SaveChanges()
Ce qui entraîne l'erreur suivante.
Entities in 'DB_ENTITIES.Brand' participate in the 'FK_Brand_Gender' relationship. 0 related 'Gender' were found. 1 'Gender' is expected.
Quelqu'un pourrait-il m'expliquer les paramètres en anglais clair? J'ai aussi essayé DB.Gender en tant que premier paramètre, mais pas de joie.
La solution
Plutôt que de créer une EntityKey, créez un objet Sexe de talon (désolé je ne suis pas un gars de VB, donc en C #):
Gender g = new Gender{ID = Int32.Parse(Request.Form("Gender"))};
Ensuite, vous attachez le genre au EntitySet
approprié (le nom de la propriété sur la DB
à partir de laquelle vous obtenez les entités de genre est la chaîne ci-dessous):
DB.AttachTo("Genders",g);
Ceci place la base de données dans l'état où le genre est dans le ObjectContext
dans l'état non modifié sans requête à la base de données. Maintenant, vous pouvez construire une relation comme d'habitude
brand.Gender = g;
DB.AddToBrand(brand);
DB.SaveChanges();
C'est tout ce qu'il y a à faire. Inutile de vous amuser avec EntityKeys
J'espère que cela vous aidera
Autres conseils
Il vous faut une instance de marque et de sexe, puis définissez Brand.Gender sur l’instance de genre. Ensuite, vous pouvez enregistrer sans problèmes.
Ok, voici ce que j'ai inventé au lieu d'utiliser updateModel. De toute façon, il semble que cela pose un problème / potentiellement un risque pour la sécurité, des champs potentiellement supplémentaires étant ajoutés ultérieurement. Une nouvelle instance de genre peut être instanciée via trygetObjectByKey. Cela fonctionne jusqu'à présent. Toute autre suggestion permettant à UpdateModel de mettre à jour l'objet de propriété Gender est appréciée.
Dim cID As Integer
cID = CInt(Request.Form("Gender"))
Dim key As New EntityKey(DB.DefaultContainerName() & ".Gender", "ID", cID)
Dim objGenderDS As New Gender
'Bring back the Gender object.
If DB.TryGetObjectByKey(key, objGenderDS) Then
Brand.GenderReference.EntityKey = key
Brand.Gender = objGenderDS
DB.AddToBrand(Brand)
DB.SaveChanges()
Else
End If