2011-06-07 33 views
3

我正在構建一個MVC3項目,首先使用Razor和Entity Framework代碼。我有兩種模式:實體框架「ObjectStateManager中已存在具有相同鍵的對象。」 - 我無法理解如何或從這裏做什麼

public class Translation 
{ 
    public int TranslationId { get; set; } 
    public string Pt { get; set; } 
    public string Es { get; set; } 
    public string En { get; set; } 
} 

public class Page 
{ 
    public int PageId { get; set; } 
    public Translation Title { get; set; } 
    public Translation Description { get; set; } 

    public int? ParentPageId { get; set; } // page can have a parent page 
    public Page ParentPage { get; set; } 
} 

我爲頁面模型的CRUD創建了PagesController。然後我編輯添加輸入的翻譯性質的創建和編輯觀點:

它運作良好,上創建,增加兩條新線的翻譯表(一個由Title_TranslationId和其他Description_TranslationId refered)與輸入內容。但在更新的時候,我得到的提到的錯誤在行:

db.Entry(page).State = EntityState.Modified; 

的PagesController是因爲它被創造了,所以沒有多餘的武官都正在取得進展。如果我在編輯視圖中刪除其中一個翻譯輸入,它不會拋出錯誤,但不會更新翻譯。

的PagesController代碼:

private AdminEntities db = new AdminEntities(); 
    public ViewResult Index() 
    { 
     return View(db.Pages.ToList()); 
    } 
    public ViewResult Details(int id) 
    { 
     Page page = db.Pages.Find(id); 
     return View(page); 
    } 
    public ActionResult Create() 
    { 
     ViewBag.ParentPageId = new SelectList(db.Pages, "ParentPageId", "Description"); 
     return View(); 
    } 
    [HttpPost] 
    public ActionResult Create(Page page) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Pages.Add(page); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     ViewBag.ParentPageId = new SelectList(db.Pages, "ParentPageId", "Description", page.ParentPageId); 
     return View(page); 
    } 
    public ActionResult Edit(int id) 
    { 
     Page page = db.Pages.Find(id); 
     ViewBag.ParentPageId = new SelectList(db.Pages, "ParentPageId", "Description", page.ParentPageId);    
     return View(page); 
    } 
    [HttpPost] 
    public ActionResult Edit(Page page) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Entry(page).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     ViewBag.ParentPageId = new SelectList(db.Pages, "ParentPageId", "Description", page.ParentPageId); 
     return View(page); 
    } 
} 

注意ViewBag.ParentPageId饋送頁面列表,我並沒有在視圖中包含的代碼,因爲它的工作原理,如果我刪除翻譯的東西。

任何想法?

編輯:也許這對EF來說太複雜了?也許我應該改變我的見解。

+1

你能發佈編輯控制器代碼嗎? – Tridus 2011-06-07 01:36:42

+0

剛剛編輯,謝謝。 – noinstance 2011-06-07 01:40:12

+0

您需要在您的模型類中聲明屬性爲虛擬 – 2011-06-07 03:13:32

回答

4

解決

我做兩個初學者的錯誤。

錯誤#1:忘記添加翻譯屬性標識在視圖中,因此它們可以是綁定在POST方法:

@Html.HiddenFor(model => model.Title.TranslationId) 
@Html.HiddenFor(model => model.Description.TranslationId) 

錯誤#2:翻譯性能,因爲它們是翻譯的實例類,在更新之前必須設置爲已修改:

db.Entry(page.Title).State = EntityState.Modified; 
db.Entry(page.Description).State = EntityState.Modified; 

db.Entry(page).State = EntityState.Modified; 
db.SaveChanges(); 

它現在有效。我失去了幾個小時,但至少我認爲我學到了一些東西:)

+0

偉大的見解!這也解決了我的問題。 – 2011-12-23 20:07:44

1

嘗試使用 db.Pages.Attach(page);
db.ObjectStateManager.ChangeObjectState(page, EntityState.Modified);
代替db.Entry(page).State = EntityState.Modified; 它將附加實體改性

+0

嘿,謝謝。 dataContext不存在? – noinstance 2011-06-07 03:31:54

+0

啊。它應該是你的db.Pages :) – 2011-06-07 03:34:34

+0

錯誤:「沒有超載的附加需要兩個參數」 – noinstance 2011-06-07 03:39:00

0

我使用這個,因爲我已經創建了一個新的實例,並填充了我需要更新的屬性。

var key=this.CreateEntityKey("Pages",page); 
     ObjectStateEntry ose; 
     if(this.ObjectStateManager.TryGetObjectStateEntry(key, out ose)){ 
      var entity=(Page)ose.Entity; 
      Pages.Detach(entity); 
     } 
      this.Pages.Attach(page); 
相關問題