ASP.NET Core 6中一对多关系的创建/更新功能异常
问题:EF Core一对多关系中Category的创建/更新功能失效
问题背景
我正在学习EF Core,首次实现一对多关系时遇到问题。根据模型自动生成了控制器及所有CRUD视图,未修改任何自动生成代码,但删除和详情功能正常,仅创建和更新功能失效。手动向数据库添加数据验证了删除和详情功能可用,但通过控制器创建数据无效。
模型代码
public class Category { [Key] public int CategoryId { get; set; } public string Name { get; set; } public string img { get; set; } public virtual ICollection<SubCategory> SubCategories { get; set; } } public class SubCategory { [Key] public int SubCategoryId { get; set; } public string SubCategoryName { get; set; } public string url { get; set; } [ForeignKey("CategoryId")] public int CategoryId { get; set; } public virtual Category Category { get; set; } }
CategoryController相关代码
// GET: Categories/Create public IActionResult Create() { return View(); } // POST: Categories/Create // To protect from overposting attacks, enable the specific properties you want to bind to. [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Create([Bind("CategoryId,Name,img")] Category category) { if (ModelState.IsValid) { _context.Add(category); await _context.SaveChangesAsync(); return RedirectToAction(nameof(Index)); } return View(category); } // GET: Categories/Edit/5 public async Task<IActionResult> Edit(int? id) { if (id == null || _context.Categories == null) { return NotFound(); } var category = await _context.Categories.FindAsync(id); if (category == null) { return NotFound(); } return View(category); } // POST: Categories/Edit/5 // To protect from overposting attacks, enable the specific properties you want to bind to. [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Edit(int id, [Bind("CategoryId,Name,img")] Category category) { if (id != category.CategoryId) { return NotFound(); } if (ModelState.IsValid) { try { _context.Update(category); await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!CategoryExists(category.CategoryId)) { return NotFound(); } else { throw; } } return RedirectToAction(nameof(Index)); } return View(category); }
排查与解决方案
检查ModelState错误:
ModelState.IsValid可能为false导致保存逻辑未执行。可在POST方法中添加错误日志,或在视图中显示验证信息:// 在POST Create方法的ModelState判断前添加 foreach (var error in ModelState.Values.SelectMany(v => v.Errors)) { Console.WriteLine(error.ErrorMessage); }常见原因是
Name/img为EF Core默认的非空字段,但视图中未填写或输入不符合规则。确认数据库迁移状态:确保已生成并应用迁移,保证数据库结构与模型匹配:
Add-Migration InitialCreate Update-Database验证表单字段绑定:检查视图中表单输入框的
name属性,是否和[Bind]中的字段(Name、img)完全一致,避免拼写错误。优化Edit方法的更新逻辑:自动生成的
_context.Update(category)可能引发不必要的字段覆盖,建议改为先查询再更新指定属性:// 替换Edit POST方法中的更新代码 var existingCategory = await _context.Categories.FindAsync(id); if (existingCategory == null) return NotFound(); existingCategory.Name = category.Name; existingCategory.img = category.img; await _context.SaveChangesAsync();
内容的提问来源于stack exchange,提问作者Nitish ML
相关产品推荐
相关产品推荐

