微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ASP MVC 实体框架核心在表单帖子上更新多对多关系

如何解决ASP MVC 实体框架核心在表单帖子上更新多对多关系

我想知道在提交表单时更新多对多关系的好做法。

我得到了这两个实体,并使用了 EF 核心 5 中认的多对多关系:

public class BlogEntry
   {
      public int Id { get; set; }
      [required]
      [MaxLength(200)]
      public string Title { get; set; }
      [required]
      public string EntryText { get; set; }
      [NotMapped] 
      public IEnumerable<string> CategoriesToPublish { get; set; } 
      public ICollection<Category> Categories { get; set; } 

   }
   public class Category
   {
      public int Id { get; set; }
      public string Name { get; set; }
      public ICollection<BlogEntry> BlogEntries { get; set; }
   }

上下文:

      public DbSet<BlogEntry> BlogEntries { get; set; }
      public DbSet<Category> Categories { get; set; }

我有一个带有多选字段的表单来表示这种关系。见图片 form

我没有在表单上使用关系属性(我应该使用关系属性,但我不知道),我有一个属性可以将关系转换为名为 CategoriesToPublish 的字符串列表,以便我可以加载多选并检索帖子中的选择。

在 post action 方法中,我想迭代 this CategoriesToPublish 并更新所有关系。

      [HttpPost]
      [ValidateAntiForgeryToken]
      public async Task<IActionResult> Publish(BlogEntry blogEntry)
      {
         if (ModelState.IsValid)
         {
            blogEntry.Categories = await _context.Categories.Where(x => x.BlogEntries.Any(x => x.Id == blogEntry.Id)).ToListAsync();
            await UpdateCategories(blogEntry);
            _context.Update(blogEntry);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(List));
         }
         return View(blogEntry);
      }

但我面临的问题是 Categories 关系未在回发时加载。如果我尝试手动加载它并保存上下文,我会收到一条错误消息 sqlException: Violation of PRIMARY KEY constraint 'PK_BlogEntryCategory'. Cannot insert duplicate key in object 'dbo.BlogEntryCategory'

我不知道如何解决这个问题。有什么建议吗?

解决方法

经过大量搜索,我找到了解决方案。

      [HttpPost]
      [ValidateAntiForgeryToken]
      public async Task<IActionResult> Publish(BlogEntry blogEntry)
      {
         if (ModelState.IsValid)
         {
            blogEntry = _context.Update(blogEntry).Entity;
            blogEntry.Categories = await _context.Entry(blogEntry).Collection(u => u.Categories).Query().ToListAsync();
            await UpdateCategories(blogEntry);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(List));
         }
         return View(blogEntry);
      }

我在 Update 之后检索 blogEntry:

blogEntry = _context.Update(blogEntry).Entity;

此时 Categories 仍然是空的,但现在我们可以再次从数据库加载它们:

blogEntry.Categories = await _context.Entry(blogEntry).Collection(u => u.Categories).Query().ToListAsync();

和 boola,现在我们可以根据需要迭代所有类别更改它们,它不会抱怨重复键。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。