在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的名称。
答案 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中被整理出来