2009-06-18 13 views
7

Como resultado de una publicación de formulario, intento guardar un nuevo registro de marca. En mi punto de vista, el género es un desplegable, que devuelve un entero, que está poblada de ViewData ("género")Entity Framework EntityKey/Foreign Key problema

he fijado mi enlace de la siguiente manera:

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

que se traduce en el siguiente error.

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

Podría alguien explicar los parámetros en inglés sencillo para mí. También probé DB.Gender como el primer parámetro, pero sin alegría.

Respuesta

18

En lugar de crear un EntityKey crear un objeto talón de Género (lo siento, no soy un tipo VB por lo que en C#):

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

A continuación se adjunta el género a la adecuada EntitySet (la nombre de la propiedad en DB que se obtiene a partir de entidades de género es la cadena más adelante):

DB.AttachTo("Genders",g); 

Esto pone a la base de datos en el estado donde el género está en el ObjectContext en el estado sin cambios sin consulta de base de datos. Ahora puede construir una relación como en la normal

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

Eso es todo lo que hay que hacer. No hay necesidad de lodo alrededor con EntityKeys

Esperanza esto ayuda

Alex

+0

Gracias por la respuesta Alex - obteniendo esto ahora: Ya existe un objeto con la misma clave en el ObjectStateManager. ObjectStateManager no puede rastrear múltiples objetos con la misma clave. – Paul

+0

Paul, ¿cómo resolviste el problema de "varios objetos con la misma clave"? Estoy recibiendo lo mismo. – Picflight

+2

Antes de adjuntar algo al contexto, debe verificar el ObjectStateManager utilizando LINQ to Objects para verificar que el mismo objeto no esté allí. –

1

Lo que necesita es una instancia de Marca y Género y luego configure Brand.Gender para la instancia de Género. Entonces puedes guardar sin problemas.

+0

¿Eso no implica un ida y vuelta a mi base de datos? Seguramente The View está publicando una identificación que puede ser atada. – Paul

+0

Depende, si los objetos ya están en el contexto, no requiere un viaje a la base de datos. El código de Alex James es bueno de usar (prácticamente hace lo que escribí). –

0

Ok heres lo que he encontrado en lugar de usar updateModel. Parece que es problemático/potencialmente un riesgo de seguridad de todos modos con campos potencialmente adicionales que se agregan en la publicación. Se puede instanciar una nueva instancia de Género a través de trygetObjectByKey. Esto está funcionando hasta ahora. Se agradece cualquier otra sugerencia para que UpdateModel actualice el objeto de propiedad Gender.

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