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

Gra*_*ett 6 asp.net-mvc entity-framework asp.net-3.5

亚历克斯詹姆斯的实体框架提示文章,(顺便说一句,这是很好的)他谈到如何假冒外国关键属性.这似乎正是我所需要的,但无论出于何种原因,我在更新时似乎无法将其拉下来.我在控制器的更新部分有以下内容:

[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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

这失败并吐出以下内容:

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

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

Gra*_*ett 4

我发现,我的 EntitySet 确实不正确。我通过在创建新实体键时传递以下内容作为第一个参数来解决这个问题:

originalCandidate.educationReference.EntityKey = new System.Data.EntityKey(originalCandidate.educationReference.EntityKey.EntityContainerName + "." + originalCandidate.educationReference.EntityKey.EntitySetName, "ID", candidateToEdit.education.ID);
Run Code Online (Sandbox Code Playgroud)

有点恶心,但它有效。期待 EF 中的外键混乱在 .net 4.0 中得到解决