0

我一直在這幾天一直在困擾着我的大腦,並嘗試了許多「修復」,但都無濟於事。MVC4 EF代碼第一個存儲庫模式多對多編輯不更新

我使用MVC4與EF代碼第一,和存儲庫模式上的多對多關係。根據我可以知道的數據庫的種子數據庫正確創建表,我的顯示正確顯示值。

我遇到的問題是試圖保存編輯。我有一個編輯視圖,列表框包含一組枚舉對象(B's),並且在提交(HttpPost)上我基本上要調用A.ClassBs.Clear()和db.SaveChanges()。但是,當我這樣做時,ClassA.ClassBs不是空白。例如,如果我從A更新另一個屬性,則必須在db.SaveChanges()之前包含db.Entry(ClassA).State = EntityState.Modified,否則更改不會保存到數據庫。

當我包含EntityState.Modified行時,ClassA會按預期進行更新,但多對多關係除外。 ClassA.ClassBs保持不變。

下面是一些

Models 
class A 
{ 
    ... 
    virtual IEnumerable<ClassB> ClassBs {get;set;} 
} 

class B 
{ 
    ... 
    virtual IEnumerable<ClassA> ClassAs {get;set;} 
} 

Controller 
public ActionResult Edit(int id - 0) 
{ 
    ... (create viewmodel) 
    return View(viewmodel) 
} 

[HttpPost] 
public ActionResult Edit(viewmodel) 
{ 
    viewmodel.A.ClassBs.Clear(); 
    db.Entry(viewmodel.A).State = EntityState.Modified; 
    db.SaveChanges(); 
} 

View 
@Html.ListBoxFor(model => model.ClassA.ClassBs, Model.ClassBs) 

一些奇怪的發生的事情與我的結合。我究竟做錯了什麼?

+2

當編輯行動呼籲後,你得到的參數是「分離」,所以你必須重視它適用於任何更改的視圖模型。 – jannagy02

+0

你能詳細說一下嗎?我不熟悉附加和分離實體。 – CrazyTegger

+0

根據這篇文章:http://stackoverflow.com/questions/7512636/dbcontext-state-and-original-values,將ClassA的條目的狀態設置爲Modified將照顧到我的附件。但是,仍然不會像我所期望的那樣更新ClassA.ClassBs。 – CrazyTegger

回答

0

您在分離的實體上致電viewmodel.A.ClassBs.Clear()。在您撥打RemoveClear之前,您需要附加實體它與ClassB相關,以便上下文知道要刪除的內容。

how-to-delete-many-to-many-relationship-in-entity-framework

如何Add/Attach and Entity States

+0

謝謝。我開始經歷這個,但顯然我沒有可用的Attach方法。 我的上下文被定義爲: public class EFDbContext:DbContext { public DbSet ClassBs {get;組; } } 手動創建此方法嗎? – CrazyTegger

+0

我在這裏必須缺少一些東西,在Entity類中沒有附加方法,但是我在上下文中執行。鏈接中描述的解決方案具有使用附加方法的實體。 此外,給定的解決方案完全刪除ClassB。我想要做的就是刪除鏈接,而不是刪除整個班級。 – CrazyTegger