使用实体密钥伪造外键更新

时间:2009-07-08 19:00:58

标签: asp.net-mvc entity-framework asp.net-3.5

Alex James' Entity Framework tips articles中,(顺便说一句,这很棒)他谈到how to fake foreign key properties。这似乎正是我所需要的,但无论出于何种原因,我在更新时似乎无法将其拉下来。我在控制器的更新部分有以下内容:

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

此操作失败并吐出以下内容:

System.ArgumentException:元数据集合中不存在具有标识“model”的成员。参数名称:System.Data.Metadata.Edm.MetadataCollection 1.GetValue(String identity, Boolean ignoreCase) at System.Data.Metadata.Edm.ReadOnlyMetadataCollection处的身份1.系统上的System.Data.Metadata.Edm.ItemCollection.GetEntityContainer(String name,Boolean ignoreCase)中的1.GetValue(字符串标识,布尔值ignoreCase)位于System.Data的System.Data.EntityKey.GetEntitySet(MetadataWorkspace metadataWorkspace)的System.Data.Metadata.Edm.MetadataWorkspace.GetEntityContainer(String name,DataSpace dataSpace)中的.Data.Metadata.Edm.ItemCollection.GetEntityContainer(String name)。位于C:\ Documents and Settings \ graham \ My Documents \ Visual Studio 2008 \ Projects \ InternshipTest \ InternshipTest \ Controllers \ CandidatesController中的InternshipTest.Controllers.CandidatesController.Edit(候选者candidateToEdit)中的Objects.DataClasses.EntityReference.set_EntityKey(EntityKey value)。 cs:第84行

这对我没有任何意义,模型绝对是EntitySet的名称。

1 个答案:

答案 0 :(得分:4)

我想通了,实际上我确实让EntitySet不正确。在创建新的实体键时,我通过传递以下内容作为第一个参数来解决它:

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

有点讨厌,但它确实有效。 期待EF中的外键混乱在.net 4.0中被整理出来