在我的编辑控制器操作中,我发布要更新的对象。
[HttpPost]
public virtual ActionResult Edit(Case myCase){
var currentDocuments = db.CaseDocuments.Where(p => p.idCase == myCase.idCase);
foreach (CaseDocument docInDB in currentDocuments )
{
var deleteDoc = true;
foreach (CaseDocument docNew in myCase.CaseDocuments )
{
if (docNew.idDocument == docInDB.idDocument)
deleteDoc = false;
}
if (deleteDoc )
db.CaseDocuments.Remove(docInDB);
}
foreach (CaseDocument pc in myCase.CaseDocuments)
{
if (pc.idDocument == 0)
db.CaseDocuments.Add(pc);
else
db.Entry(pc).State = EntityState.Modified;
}
*** **db.Entry(myCase).State = EntityState.Modified;** //THIS LINE
db.SaveChanges();
}
该Case
模型有一个集合Documents
,它们与案例模型一起发布。
进入操作后,我可以计算集合中的文档数量,假设有 3 个。
然后,为了查看是否需要从数据库中删除文档(因为用户从 UI 中删除了文档),我需要以这种方式从数据库中获取该案例的文档:
var currentDocuments = db.CaseDocuments.Where(p => p.idCase == myCase.idCase);
这里开始了奇怪的事情:一旦我执行该语句,它myCase.Documents
就会加载它在数据库中的内容(假设有 4 个)!因此,我无法比较这两个集合(以检测文档是否被删除并将其从数据库中删除)。
我需要的是在我的案例模型的编辑操作期间,我需要创建/更新/修改其文档。我需要从其他角度看这个吗?我在做什么是错的?
编辑: 在评论之后,我意识到我将 myCase 标记为已修改的那一行是在开头,我想这就是这种行为的原因。
现在,将该行移至 db.SaveChanges() 之前,解决了该问题,但在db.Entry(myCase).State = EntityState.Modified;
“ ObjectStateManager 中已经有一个具有相同键的对象。 ”
我在这里做错了什么?这段代码看起来很糟糕!