2009-07-08 3 views
6

Dans Alex James' Entity Framework tips articles, (qui sont excellents en passant), il parle de how to fake foreign key properties. Cela semble exactement ce dont j'ai besoin, mais pour une raison quelconque, je ne peux pas sembler le retirer quand je suis mise à jour. Je les éléments suivants dans la partie de mise à jour de mon contrôleur:Faking mises à jour de clé étrangère en utilisant les clés d'entité

[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(); 
     } 
    } 

Cela échoue et recrache les éléments suivants:

System.ArgumentException: Le membre avec « modèle » d'identité n'existe pas dans la collection de métadonnées. Nom du paramètre: identity à System.Data.Metadata.Edm.MetadataCollection 1.GetValue(String identity, Boolean ignoreCase) at System.Data.Metadata.Edm.ReadOnlyMetadataCollection 1.GetValue (String identity, Boolean ignoreCase) à System.Data.Metadata.Edm.ItemCollection.GetEntityContainer (nom de chaîne, Boolean ignoreCase) à System.Data.Metadata .Edm.ItemCollection.GetEntityContainer (nom de chaîne) à System.Data.Metadata.Edm.MetadataWorkspace.GetEntityContainer (nom de chaîne, DataSpace dataSpace) à System.Data.EntityKey.GetEntitySet (MetadataWorkspace metadataWorkspace) à System.Data.Objects.DataClasses. EntityReference.set_EntityKey (EntityKey value) à InternshipTest.Controllers.CandidatesController.Edit (candidats candidateToEdit) dans C: \ Documents and Settings \ graham \ Mes documents \ Visual Studio 2008 \ Projects \ InternshipTest \ InternshipTest \ Controllers \ CandidatesController.cs: ligne 84

Ce qui n'a aucun sens pour moi, le modèle est certainement le nom de l'EntitySet.

Répondre

4

Je l'ai compris, j'ai effectivement fait l'EntitySet incorrect. Je suis autour de lui en passant ce qui suit comme premier argument lors de la création d'une nouvelle clé d'entité:

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

Kinda méchant, mais il fonctionne. Dans l'attente de la désordre de la clé étrangère dans EF étant triés dans. NET 4.0

+1

Heureux que vous aimez la série. BTW il y avait un bug d'exception de référence NULL dans le blog, que je viens de corriger. –