2009-06-18 16 views
7

W wyniku postu formularza próbuję zapisać nowy rekord marki. Moim zdaniem, płci jest rozwijana, wracając liczbą całkowitą, która jest wypełniona z ViewData („gender”)Entity Framework EntityKey/Foreign Key Problem

mam mój link konfigurację następująco:

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

co prowadzi do następującego błędu.

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

Czy ktoś mógłby wyjaśnić mi parametry w prostym angielskim. Próbowałem również DB.Gender jako pierwszego parametru, ale bez radości.

Odpowiedz

18

Zamiast stworzenie EntityKey utworzyć obiekt stub Płeć (przepraszam nie jestem VB facet tak w C#):

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

Następnie przymocować Płeć do odpowiedniego EntitySet (the nazwa obiektu na DB że masz podmioty z GG jest ciąg poniżej):

DB.AttachTo("Genders",g); 

stawia bazy danych w państwie, w którym płeć jest w stanie niezmienionym bez zapytania bazy danych. Teraz możesz zbudować relację zgodnie z normą:

To wszystko, co można. Nie trzeba syf wokół z EntityKeys

nadzieję, że to pomaga

Alex

+0

Dzięki za odpowiedź Alex - otrzymanie tego teraz: Obiekt o tym samym kluczu już istnieje w ObjectStateManager. ObjectStateManager nie może śledzić wielu obiektów za pomocą tego samego klucza. – Paul

+0

Paul, jak rozwiązałeś problem "wielu obiektów z tym samym kluczem"? Dostaję to samo. – Picflight

+2

Przed dołączeniem do kontekstu powinieneś sprawdzić ObjectStateManager używając LINQ do Objects, aby sprawdzić, czy ten sam obiekt jeszcze tam nie jest. –

1

Potrzebne jest wystąpienie obu marek i płci, a następnie ustawienie Brand.Gender na wystąpienie płci. Następnie możesz zapisać bez problemów.

+0

Czy to nie angażować okrągłą podróż do mojego DB? Z pewnością Widok oddaje identyfikator, który można powiązać. – Paul

+0

To zależy, czy obiekty są już w kontekście, nie wymaga podróży do bazy danych. Kod Alex James jest dobry w użyciu (prawie tak jak napisałem). –

0

Ok heres co wymyśliłem zamiast używać updateModel. Wydaje się, że jest problematyczne/potencjalnie nadal stanowi zagrożenie dla bezpieczeństwa, a potencjalnie dodatkowe pola są dodawane w poście. Nowe wystąpienie płci można utworzyć za pomocą trygetObjectByKey. To działa do tej pory. Wszelkie inne sugestie dotyczące uzyskania aktualizacji UpdateModel obiektu płci są doceniane.

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