2009-06-18 13 views
7

Als Ergebnis einer Formularpost versuche ich einen neuen Markenrekord zu speichern. Aus meiner Sicht ist Gender ein Drop-Down, eine Integer Rückkehr, die von Viewdata aufgefüllt wird ("gender")Entity Framework EntityKey/Foreign Key Problem

ich mein Setup Link haben Sie wie folgt vor:

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

die in den folgenden Fehler führt.

Entities in 'DB_ENTITIES.Brand' participate in the 'FK_Brand_Gender' relationship. 0 related 'Gender' were found. 1 'Gender' is expected. 

Könnte jemand mir die Parameter in einfachem Englisch erklären. Ich habe auch DB.Gender als ersten Parameter aber keine Freude ausprobiert.

Antwort

18

Anstatt die Schaffung einer EntityKey ein Objekt Stub Geschlecht erstellen (sorry, ich bin kein VB Kerl so in C#):

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

Dann Sie das Geschlecht an den entsprechenden EntitySet befestigen (das Name der Eigenschaft auf DB dass Sie Geschlecht Einheiten erhalten aus der Zeichenfolge unten):

DB.AttachTo("Genders",g); 

Dies versetzt die Datenbank in dem Zustand, in dem Das Geschlecht ist in der ObjectContext im unveränderten Zustand ohne eine Datenbankabfrage. Jetzt können Sie eine Beziehung wie normal

brand.Gender = g; 
DB.AddToBrand(brand); 
DB.SaveChanges(); 

bauen Das ist alles, was es ist. Keine Notwendigkeit zu vertrödeln mit EntityKeys

this helps

Alex

+0

Danke für die Antwort Alex - bekomme das jetzt: Ein Objekt mit dem gleichen Schlüssel existiert bereits im ObjectStateManager. Der ObjectStateManager kann mehrere Objekte mit demselben Schlüssel nicht verfolgen. – Paul

+0

Paul, wie hast du das Problem "mehrere Objekte mit demselben Schlüssel" gelöst? Ich bekomme das Gleiche. – Picflight

+2

Bevor Sie etwas an den Kontext anhängen, sollten Sie den ObjectStateManager überprüfen, indem Sie LINQ to Objects verwenden, um zu prüfen, ob das gleiche Objekt bereits vorhanden ist. –

1

Sie benötigen eine Instanz von Brand und Gender und dann legen Sie Brand.Gender auf die Instanz des Gender. Dann können Sie ohne Probleme speichern.

+0

Ist das nicht eine Rundreise in meine DB einbeziehen? Sicherlich gibt die View eine ID zurück, die gebunden werden kann. – Paul

+0

Es kommt darauf an, wenn die Objekte bereits im Kontext sind, erfordert es keinen Trip zur db. Alex James Code ist gut zu benutzen (es tut so ziemlich wie ich geschrieben habe). –

0

Ok heres, was ich habe, anstatt updateModel zu verwenden. Es scheint problematisch/potentiell ein Sicherheitsrisiko zu sein, mit möglicherweise zusätzlichen Feldern in der Post hinzugefügt werden. Eine neue Instanz von Gender kann über trygetObjectByKey instanziiert werden. Dies funktioniert soweit. Weitere Vorschläge zum Aktualisieren von UpdateModel zum Aktualisieren des Gender-Eigenschaftenobjekts

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