【问题标题】:How do I update all tags on a blog post?如何更新博客文章中的所有标签?
【发布时间】:2014-05-15 23:56:01
【问题描述】:

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

博客和标签实体设置为多对多。

所以目前我有:

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

如果我要添加新标签,这会很好。但是,如果我要删除标签,它只适用于实体框架方面。一旦 DB Context 重新初始化,它就会从数据库中获取标签仍附加到博客的信息。

例如我在博客中添加了标签“测试”。我编辑博客并删除标签“测试”并保存博客。博客由相同的请求返回,标签列表为空。如果我再对博客提出另一个请求,那么标签“test”又回来了。

我想我可以每次都从博客中删除所有标签,然后添加其中的任何标签。但我确信一定有更好的方法。还是设置有误,这应该在当前设置中起作用?

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

【问题讨论】:

  • 你能在你删除的地方添加你的代码吗?
  • @NathanA 实际上没有任何删除代码。 blog.Tags 是标签的新列表,可能有新标签、可能有更少标签或可能完全相同。删除是我正在努力解决的问题。

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


【解决方案1】:

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

首先您需要获取现有的标签列表。我假设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 调用来删除所有多对多关系,然后使用 Entities 重新添加它们,而不是必须弄清楚每个添加和删除操作。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    相关资源
    最近更新 更多