我有一个项目。
public class Project
{
public int Id { get; set; }
public int? ParentProjectId { get; set; }
public DateTime? Deadline { get; set; }
public Project ParentProject { get; set; }
}
当我输入一个日期 Deadline
在一个子项目上,我想确保它不超过 Deadline
的父项目。
我在Startup.cs中这样注册验证器。
services.AddTransient<IValidator<Project>, ProjectValidator>();
我试了一下
RuleFor(x => x.Deadline)
.LessThanOrEqualTo(x => x.ParentProject.Deadline)
.WithMessage("The deadline cannot exceed the deadline of the parent project.");
但我得到的是
NullReferenceException。对象引用未被设置为一个对象的实例。
这是因为在验证时,父项目没有被加载。
如何才能让它工作?
更新
我做了这个变通方法。
在控制器的POST方法中
DateTime? parentProjectDeadline = await db.Projects
.Where(p => p.Id == project.ParentProjectId)
.Select(d => d.Deadline)
.FirstOrDefaultAsync();
if (project.Deadline > parentProjectDeadline)
{
ModelState.AddModelError("Deadline", "The deadline cannot exceed the deadline of the parent project.");
}
.当
你可以排除在验证时没有加载父项目的情况。
RuleFor(x => x.Deadline)
.When(x => x.ParentProject != null)
.LessThanOrEqualTo(x => x.ParentProject.Deadline)
.WithMessage("The deadline cannot exceed the deadline of the parent project.");
为什么没有加载?
你能解释一下ParentProject如何在 "验证时 "没有被加载吗?对它的getter的调用不是应该总是加载并返回它吗?_id
有价值吗?