2009-07-08 12 views
6

En Alex James' Entity Framework tips articles, (que son excelentes por cierto) habla de how to fake foreign key properties. Esto parece exactamente lo que necesito, pero por alguna razón no puedo lograrlo cuando estoy actualizando. Tengo el siguiente en la parte de la actualización de mi controlador:Fingiendo actualizaciones de claves foráneas usando las claves de entidad

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Edit(candidates candidateToEdit) 
    { 
     string EduIDValue = candidateToEdit.education.ID.ToString(); 

     if (!ModelState.IsValid) 
      return View(); 

     try 
     { 
      var originalCandidate = (from c 
              in model.candidates 
              where c.ID == candidateToEdit.ID select c).FirstOrDefault(); 

      //attempting it here 
      originalCandidate.educationReference.EntityKey = new System.Data.EntityKey("model.education", "ID", candidateToEdit.education.ID); 

      model.ApplyPropertyChanges(originalCandidate.EntityKey.EntitySetName, candidateToEdit);     
      model.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     catch(Exception e) 
     { 
      Response.Write("Education ID Value " + EduIDValue + "<br /><br />Error: <br /><br />" + e); 
      return null;     
      //return View(); 
     } 
    } 

Esta falla y escupe lo siguiente:

System.ArgumentException: El miembro con el 'modelo' identidad no existe en la colección de metadatos. Nombre del parámetro: identidad en System.Data.Metadata.Edm.MetadataCollection 1.GetValue(String identity, Boolean ignoreCase) at System.Data.Metadata.Edm.ReadOnlyMetadataCollection 1.GetValue (String identity, Boolean ignoreCase) en System.Data.Metadata.Edm.ItemCollection.GetEntityContainer (String name, Boolean ignoreCase) en System.Data.Metadata .Edm.ItemCollection.GetEntityContainer (String name) en System.Data.Metadata.Edm.MetadataWorkspace.GetEntityContainer (String name, DataSpace dataSpace) en System.Data.EntityKey.GetEntitySet (MetadataWorkspace metadataWorkspace) en System.Data.Objects.DataClasses. EntityReference.set_EntityKey (valor EntityKey) en InternshipTest.Controllers.CandidatesController.Edit (candidatos candidateToEdit) en C: \ Documents and Settings \ graham \ Mis documentos \ Visual Studio 2008 \ Projects \ InternshipTest \ InternshipTest \ Controllers \ CandidatesController.cs: línea 84

Lo cual no tiene ningún sentido para mí, el modelo es definitivamente el nombre de el EntitySet.

Respuesta

4

Lo descubrí, de hecho, tenía el EntitySet incorrecto. Tengo alrededor de ella haciendo pasar el siguiente como primer argumento al crear una nueva clave de entidad:

originalCandidate.educationReference.EntityKey = new System.Data.EntityKey(originalCandidate.educationReference.EntityKey.EntityContainerName + "." + originalCandidate.educationReference.EntityKey.EntitySetName, "ID", candidateToEdit.education.ID); 

Un poco desagradable, pero funciona. Esperando que se solucione el problema de clave foránea en EF en .net 4.0

+1

Me alegra que le guste la serie. Por cierto, había un error de excepción de referencia NULL en la publicación del blog, que acabo de arreglar. –

Cuestiones relacionadas