将数据访问层移至类库后,一对多导航属性致ModelState无效的原因
将数据访问层迁移至类库后ModelState.IsValid返回false的原因分析
之前代码运行正常,把DbContext及实体类迁移至类库后,ModelState.IsValid返回false,排查发现是Review模型中的导航属性Category为null导致的。添加可空注解可以解决问题,以下是迁移后出现该问题的核心原因:
相关代码
Review模型
public class Review { public int Id { get; set; } public string Author { get; set; } [MaxLength(500)] public string Body { get; set; } public int Rating { get; set; } public int CategoryId { get; set; } public Category Category { get; set; } }
Category模型
public class Category { public int Id { get; set; } public string Name { get; set; } public string Type { get; set; } public string Description { get; set; } public List<Review> Review { get; set; } }
Action代码
public async Task<IActionResult> AddReview(Review review) { if (!ModelState.IsValid) return BadRequest("Enter required fields"); await _uReviewService.AddReview(review); TempData["message"] = "success"; return RedirectToAction("Comments"); }
问题根源
核心原因是类库与原Web项目的nullable引用类型配置不一致:
- 当实体类在Web项目中时,若Web项目未启用nullable引用类型(项目文件中无
<Nullable>enable</Nullable>配置),编译器不会强制校验引用类型的非空性,模型绑定过程中即使Category为null,也不会触发ModelState的无效标记。 - 迁移至类库后,若类库的项目文件中启用了
<Nullable>enable</Nullable>,编译器会将未标记为可空的引用类型(如public Category Category { get; set; })视为必须赋值的非空类型。 - 前端提交数据时只会传递
CategoryId,不会提交完整的Category对象,导致模型绑定后Category属性为null,触发nullable校验,最终ModelState.IsValid返回false。
内容的提问来源于stack exchange,提问作者Pablo
相关产品推荐
相关产品推荐

