如何更新博客文章中的所有标签?

时间:2014-05-15 14:56:55

标签: c# asp.net-mvc-5 entity-framework-6

我有一个使用c#ASP.NET和实体框架构建的博客网站。我正在设置一个页面来创建一个允许用户添加标签的博客。这很好用。但是,在编辑博客文章时,我确信我必须错过一个技巧。我无法解决如何在一个简单的过程中更新附加到博客文章的所有标签。

博客和代码实体设置为多对多。

所以目前我有:

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

如果我添加新标签,哪个工作正常。但是,如果我删除标签,它只适用于实体框架方面。一旦数据库上下文重新初始化,它就会从数据库中选择标记仍然附加到博客上。

E.g。我有标签" test"添加到博客中。我编辑博客并删除标签" test"并保存博客。博客由同一请求返回,标记列表为空。如果我再对博客提出另一个请求,那么标签" test"又回来了。

我想我每次都可以从博客中删除所有标签,然后添加任何标签。但我确信必须有更好的方法。或者设置错误,这应该在当前设置中有效吗?

任何帮助表示赞赏。特别是如果它指出了一些我没有看到的愚蠢。

1 个答案:

答案 0 :(得分: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));

然后,我可以添加一个新的博客标签列表,而无需做任何特殊的工作。