在我的編輯控制器操作中,我發佈要更新的對象。查詢DB加載我的對象的屬性之一,它不應該
[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);
在這裏開始了奇怪的事情:一旦我executa這份聲明中,myCase.Documents
裝有什麼在數據庫(可以說有4)!所以,我無法比較2個集合(檢測文檔是否被刪除並從db中刪除)。
我需要的是在我的案例模型的編輯動作期間,我需要創建/更新/修改其文檔。 我需要從其他角度看這個嗎?我在做什麼是錯的?
編輯: 的意見後,我意識到,我打上myCase爲修改了行,在開始時,我想,這是對這種行爲的原因。
現在,移動該行只是db.SaveChanges(),固定的這個問題之前,但在db.Entry(myCase).State = EntityState.Modified;
說:「已經有與ObjectStateManager相同的密鑰的對象。」
什麼我在這裏做錯了嗎?這段代碼看起來不好!
顯示你的動作的整個身體。只有當您以前將案例附加到用於檢索當前文檔的上下文時,纔會加載您的案例文檔。 – 2012-04-22 18:15:02
@LadislavMrnka,它是......我仍在測試不同的方法,但我並不真正知道自己在做什麼。 – Romias 2012-04-22 19:19:23