2011-06-04 74 views
1

因此,我使用EF Code First成功創建我的實體並查詢數據庫以顯示項目。實體框架和MVC3創建和更新模型

我現在想提供一種編輯記錄的方法。

我有一個包含Post類:

(TypeName = "varchar")] 
[Required()] 
public string Headline { get; set; } 

public virtual PostType PostType { get; set; } 

PostType是一類我寫它有一個ID和名稱來分類文章到新聞,博客等

現在,在我的編輯控制器我看到帖子並將其傳遞給視圖模型中的視圖。我還獲得了不同帖子類型的IEnumerable。

在我看來,我用的是下面:

<div class="formFieldContainer"> 
    @Html.LabelFor(model => model.Post.PostType) 
    @Html.DropDownListFor(model => model.Post.PostType, new SelectList(Model.PostTypes, "ID", "Name")) 
    @Html.ValidationMessageFor(model => model.Post.PostType) 
</div> 

<div class="formFieldContainer"> 
    @Html.LabelFor(model => model.Post.Headline) 
    @Html.EditorFor(model => model.Post.Headline) 
    @Html.ValidationMessageFor(model => model.Post.Headline) 
</div> 

對我的編輯控制器我有以下處理後:

[HttpPost, ValidateAntiForgeryToken, ValidateInput(false)] 
public ActionResult Edit(int id, FormCollection collection) { 
    var model = new PostViewModel(); 
    model.Post = _pr.GetPost(id); //gets the post from my post repository 
    model.PostTypes = _ptr.GetPostTypes(); 

    try { 
     UpdateModel(model.Post, "Post"); 
     _pr.Save(); 
     return RedirectToRoute("Posts", new { pageNumber = 0 }); //for now go to the homepage 
    } catch (Exception e) { 
     ModelState.AddModelError("_FORM", e.Message); 
     return View(model); 
    } 
} 

現在沒有職位類型列表中,只是標題此作品。但是,對於帖子類型,它不會。我得到「1是無效的」(1是選擇列表的值),這是有道理的,因爲我的Post模型期望PostType對象,而不是int。

我想過做這樣的事情:

model.Post.PostType = model.PostTypes.Where(x => x.ID == Int32.Parse(collection.GetValues("Post.PostType")[0])).Select(p => p).FirstOrDefault(); 

但是1)它不工作,因此其obviosuly不正確的做法和2),因爲「Post.PostType」依然存在,的UpdateModel失敗。

有關如何做到這一點的任何想法?

+0

你是什麼意思不起作用?沒有具體細節就無能爲力。 – 2011-06-04 17:06:14

+0

另一個PostType被添加到數據庫!它應該是現有的,但每次都會創建一個新的。 – Terry 2011-06-04 17:06:58

回答

1

我假設你的資源庫_pr和_ptr使用不同的上下文?實體框架必須從相同的上下文中讀取和更新。由於您從另一個上下文中獲取帖子類型,EF會將其視爲新實體,因此會將其視爲數據庫中的額外行。

您應該在庫之間共享您的上下文,會話每個請求是事實上的最佳實踐。

至於可以在屬性的字符串數組傳遞更新模型函數在更新包括:

UpdateModel(model.Post, "Post", new string[] { "Headline" }); 

這將忽略該PostType值。

+0

確實是這個問題。我會根據請求的想法查看會話。我想我可以轉換我所做的,並使用Steve建議的編輯(發佈帖子)的想法? – Terry 2011-06-04 22:04:35

1

試着改變你的行動採取的Post對象:

public ActionResult Edit(Post post) { 

隨着MVC 3,EF 4,崗位目標應該從形式填充瓦爾,包括你的PostType。然後調用你的更新並保存方法。

+0

試過但我有同樣的問題。我認爲原因是我不會將PostType發佈回編輯功能。這只是選擇框中的一個int,所以它無法知道要使用哪種PostType。 – Terry 2011-06-04 22:02:33