2009-06-18 6 views
7

À la suite d'un message de formulaire, j'essaie de sauvegarder un nouvel enregistrement de marque. À mon avis, le genre est un menu déroulant, renvoyant un entier, qui est peuplé de ViewData (« genre »)Entity Framework EntityKey/Problème de clé étrangère

J'ai installé mon lien comme suit:

gID = CInt(Request.Form("Gender")) 
Brand.GenderReference.EntityKey = New EntityKey("DB_ENTITIES.Gender", "Id", gID) 
TryUpdateModel(Brand) 
DB.SaveChanges() 

qui se traduit par 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 courant? J'ai aussi essayé DB.Gender comme premier paramètre mais pas de joie.

Répondre

18

Plutôt que de créer un EntityKey créer un objet Sexe stub (désolé, je ne suis pas un gars VB donc en C#):

Gender g = new Gender{ID = Int32.Parse(Request.Form("Gender"))}; 

Ensuite, vous attachez le genre au EntitySet approprié (la nom de la propriété sur DB que vous obtenez des entités de genre est la chaîne ci-dessous):

DB.AttachTo("Genders",g); 

Cela met la base de données dans l'état où le genre est dans le ObjectContext dans l'état inchangé sans une requête de 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 ya à faire. Pas besoin de muck autour avec EntityKeys

Hope this helps

Alex

+0

Merci pour la réponse Alex - obtenir ceci maintenant: Un objet avec la même clé existe déjà dans ObjectStateManager. ObjectStateManager ne peut pas suivre plusieurs objets avec la même clé. – Paul

+0

Paul, comment avez-vous résolu le problème des «objets multiples avec la même clé»? Je reçois la même chose. – Picflight

+2

Avant d'attacher quelque chose au contexte, vous devriez vérifier ObjectStateManager en utilisant LINQ to Objects pour vérifier que le même objet n'est pas déjà là. –

1

Ce dont vous avez besoin est une instance de Brand et Gender, puis définissez Brand.Gender sur l'instance du genre. Ensuite, vous pouvez enregistrer sans problèmes.

+0

Est-ce que ne pas impliquer un aller-retour à mon DB? Assurément, la vue affiche un identifiant qui peut être lié. – Paul

+0

Cela dépend, si les objets sont déjà dans le contexte, il ne nécessite pas un voyage à la DB. Le code d'Alex James est bon à utiliser (à peu près comme je l'ai écrit). –

0

Ok heres ce que j'ai trouvé avec au lieu d'utiliser updateModel. Il semble être problématique/potentiellement un risque de sécurité de toute façon avec des champs potentiellement supplémentaires étant ajoutés dans la publication. Une nouvelle instance de Gender peut être instanciée via trygetObjectByKey. Cela fonctionne jusqu'à présent. Toute autre suggestion sur l'obtention de UpdateModel pour mettre à jour l'objet de propriété Gender apprécié.

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 
Questions connexes