我如何更新博客帖子上的所有标签

本文关键字:标签 何更新 更新 | 更新日期: 2023-09-27 18:03:27

我有一个使用c# ASP构建的博客网站。. NET和实体框架。我正在建立一个页面来创建一个允许用户添加标签的博客。这很好。然而,当谈到编辑博客文章时,我确信我一定错过了一个技巧。我不知道如何在一个简单的过程中更新所有附加到博客文章的标签。

Blog和Tag实体设置为多对多。

现在我有:

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

如果我添加新标签,它可以正常工作。然而,如果我删除标签,它只工作的实体框架方面的东西。一旦DB Context重新初始化,它就会从数据库中发现标签仍然附加到blog上。

。我有标签"测试"添加到博客。我编辑了博客,删除了"test"标签并保存了博客。博客由相同的请求返回,标记列表为空。如果我再次请求这个博客,那么标签"test"又回来了。

我想我可以每次从博客中删除所有的标签,然后添加任何存在的标签。但我相信一定有更好的办法。或者某些东西设置错误,这应该在当前设置中工作?

感谢任何帮助。特别是如果它指出了一些我没有看到的愚蠢的东西

我如何更新博客帖子上的所有标签

您不能简单地将新的子列表分配给实体对象,并期望实体找出您的所有更改。你必须自己去做。这里有一个简单的方法。这不是最有效的,有一些技巧可以加快速度,但它是有效的。

首先需要获得现有的标签列表。我假设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));

然后我可以添加一个新的Blog Tags列表,而不需要做任何特殊的工作。