2014-05-15 85 views
1

我有一個使用c#ASP.NET和實體框架構建的博客網站。我正在設置一個頁面來創建一個允許用戶添加標籤的博客。這工作正常。但是,當編輯博客帖子時,我確信我必須錯過一個竅門。我無法弄清楚如何在一個簡單的過程中更新附加到博客文章的所有標籤。如何更新博客文章中的所有標籤?

博客和標籤實體設置爲多對多。

所以目前我有:

_blog = blogRepo.GetBlogByID(blog.Id); 
_blog.Tags = blog.Tags; 
blogRepo.UpdateBlog(_blog); 
blogRepo.Save(); 

如果我加入新的標籤,工作正常。但是,如果我刪除標籤,它只能用於實體框架。只要數據庫上下文重新初始化,它就會從數據庫中提取標籤仍然附加到博客上。

E.g.我將標籤「測試」添加到博客中。我編輯博客並刪除標籤「測試」並保存博客。該博客由相同的請求返回,標籤列表爲空。如果我再爲博客提出另一個請求,那麼標籤「測試」又回來了。

我以爲我可以每次從博客中刪除所有標籤,然後添加任何在那裏的標籤。但我相信肯定有更好的辦法。或者有什麼設置錯誤,這應該在當前的設置中工作?

任何幫助表示讚賞。特別是如果它指出我沒有看到的一些愚蠢的東西。

+0

你可以在刪除的地方添加代碼嗎? –

+0

@NathanA沒有任何刪除代碼。 blog.Tags是可能有新標籤的標籤的新列表,標籤可能較少或可能完全相同。去除是我正在努力解決的問題。 – AndrewPolland

回答

0

您不能簡單地將新的子列表分配給實體對象,並期望實體找出所有更改。你必須自己做。這是一個簡單的方法。這不是最高效的,並且有加速這些技巧的竅門,但它很有效。

首先,您需要獲取現有標籤列表。我假設GetBlogByID()這樣做。然後,您不需要分配新的標籤列表,您需要在要刪除的每個標籤上撥打Remove()。這裏有一個例子:

//Generate a list of tags to remove 
var tagsToRemove = _blog.Tags.Except(myNewListOfTags).ToArray(); 

foreach(var toRemove in tagsToRemove) 
    _blog.Tags.Remove(toRemove); 

...Save changes 

現在,作爲一個優化,如果有很多的標籤,我有時會做一個直接的SQL調用刪除所有的許多一對多的關係,然後再次使用添加所有實體,而不是必須找出每個添加和刪除操作。

_myDbContext.Database.ExecuteSqlCommand(
    "DELETE FROM BlogTagsManyToManyTable WHERE BlogId = @BlogId", 
    new SqlParameter("@BlogId", blogId)); 

然後,我可以添加一個新的博客標籤列表,而不必做任何特殊的工作。

+0

完美。謝謝。 – AndrewPolland

相關問題