2012-01-25 61 views
1

我的DAL基於Entity Framework Code First。沒有數據保存在數據庫中,也沒有錯誤被觸發

我有一個後期模型和標籤模型。一個職位可以有幾個職位附加。

這是帖子:

public class Post 
{ 
    [Key] 
    public int PostID { get; set; } 
    ... 
    public virtual ICollection<Tag> Tags { get; set; } 
} 

這是我的標籤:

public class Tag 
{ 
    [Key] 
    public int TagID { get; set; } 

    [Required, StringLength(50)] 
    public string Name { get; set; } 

    public virtual ICollection<Post> Posts { get; set; } 
} 

當我救我的帖子,我沒有任何錯誤,但沒有被保存在數據庫中。

enter image description here

正如你可以在上面的TagID的截圖看到的是0,我不知道是什麼原因???

enter image description here

任何想法?建議?

我的表格在Sql Server中正確創建。

謝謝。

PS:我的代碼一定是好的,因爲我從其他位置(它的工作原理)複製/粘貼它。


UPDATE

這裏是更新標籤實體(根據具體的職位)

Tag t = m_TagRepository.GetTag(tag.Trim().ToUpper()); 
    if (t == null) t = new Tag { Name = tag.Trim().ToUpper() }; 
    post.Tags.Add(t); 

下面是代碼保存到一個職位的變化(以下標籤)

代碼
public void SavePost(Post post) 
    { 
     if (post.PostID == 0) 
     { 
      m_Context.Posts.Add(post); 
     } 
     else 
     { 
      var entry = m_Context.Entry(post); 
      entry.State = EntityState.Modified; 
     }    
     m_Context.SaveChanges(); 
    } 

我從編輯視圖頁獲取回覆:

[Authorize, HttpPost, ValidateInput(false), Theme("Admin")] 
    public ActionResult Edit(PostFullViewModel postToEdit) 
    { 
     if (!ModelState.IsValid) 
      return View(); 

     Post post = Mapper.Map<PostFullViewModel, Post>(postToEdit); 
     m_PostBusiness.UpdateTags(post, postToEdit.TagString); 
     m_PostBusiness.SavePost(post); 
     TempData.SetStatusMessage(Strings.Post_SavedSuccessfully); 

     return RedirectToAction("Manage"); 
    } 
+1

向我們展示創建實體並將其添加到上下文的代碼。 –

+0

我更新了我的問題以顯示代碼。謝謝。 – Bronzato

+0

你仍然沒有展示你是如何獲得這個職位的? –

回答

1

這是常見的問題問了很多次。您從HTTP請求中獲得了發佈視圖模型並將其映射到您的發佈實體,但實體是在EF上下文之外創建的。你比爲這個獨立帖子增加了一些標籤,附加了帖子並將帖子的狀態改爲修改。

現在問題在哪裏?問題出在EF狀態模型中。每個實體和每個independent association都有自己的狀態。將帖子更改爲已修改僅對EF表示帖子已更新,但標籤與帖子之間的標籤和關係保持不變。因爲這個EF將只保存發佈。

用於特定情況下的簡單的解決方案是這樣做的:

var post = GetPostFromYourRequest(); 
context.Posts.Attach(post); 
ProcessTags(post, postToEdit); 
context.SaveChanges(); 

整個複雜的邏輯是在過程變量。這取決於你想要做什麼。如果你只想創建新的標籤,你將會做你現在所做的事情(你必須從數據庫中加載現有的標籤,使用與附加信息相同的上下文)。

如果你想做任何複雜的操作,你應該加載原始帖子和數據庫中的所有標籤,並將你的傳入視圖模型合併到原始狀態。例如,刪除現有帖子和標籤之間的關係是非常困難的,除非再次加載數據庫的當前狀態。該問題的詳細說明是here

+0

非常感謝,它的工作原理。你的解釋非常有幫助。 – Bronzato

0
  1. 弄清楚爲什麼標籤識別爲0 - 當標籤識別爲0,你沒有設置狀態修改,從而沒有被保存。
  2. 火起來的SQL事件探查器,看看發生了什麼SQL一邊(可能沒什麼,因爲1)
  3. 經過湯姆的出色EF/MVC tutorial
相關問題