ASP.NET MVC:空外键 ID 会导致验证错误

本文关键字:验证 错误 ID MVC NET ASP | 更新日期: 2023-09-27 18:37:21

短篇小说:

我从数据库加载模型实例,对其应用更改,但是当我想更新更改时,在模型定义中设置为[Required]的外键项会发生验证异常。我已经找到了解决方法,但我不知道解决此问题的正确方法是什么?

详:

我有一个模型如下:

public class Project
{
    public int Id { get; set; }
    [Required]
    [StringLength(100, MinimumLength = 5]
    public string Name { get; set; }
    [Required]
    public virtual ApplicationUser Client { get; set; }
    [Key]
    [ForeignKey("Client")]
    public string ClientID;

    [Required]
    public virtual ApplicationUser ProjectManager { get; set; }
    [Key]
    [ForeignKey("ProjectManager")]
    public string ProjectManagerID;
    [Range(0,100)]
    [Required]
    public int Progress { get; set; }
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime CreateDate { get; set; }
    [Column("Disabled")]
    public bool Disabled{ get; set; }
    [Column("Status")]
    public string Status{ get; set; }

}

每当我将模型信息从数据库获取到实例中并对其应用更改时,我都会遇到有关所需ProjectManagerClient的异常。

Project currentProject = (from prj in dbContext.Projects
                                      where prj.Id == project.Id).Single();
//---> currentProject.ProjectManagerID      is  null 
//---> currentProject.ClientID              is  null 
//---> currentProject.ProjectManager        is  present
//---> currentProject.Client                is  present
currentProject.Name = ....
currentProject.Progress = ....
currentProject.Status = ....
currentProject.Disabled = ....
dbContext.Entry(currentProject).State = System.Data.Entity.EntityState.Modified;
dbContext.SaveChanges();        //--> Validation error for required Client,ProjectManager

这是由于以下事实引起的:当我从数据库,ClientID和ProjectManagerID进行ftech信息时为空,如果我按如下方式手动设置它们,它将修复:

            currentProject.Name = project.Name;
            currentProject.Progress = project.Progress;
            currentProject.Status = project.Status;
            currentProject.Disabled = project.Disabled;
            currentProject.ProjectManagerID = currentProject.ProjectManager.Id;
            currentProject.ClientID = currentProject.Client.Id;
            try
            {
                dbContext.Entry(currentProject).State = System.Data.Entity.EntityState.Modified;
                dbContext.SaveChanges();
            }
            catch (DbEntityValidationException e)
            {
                addValidationErrorsToModelState(e);
                return View(project);
            }

我对virtual设置持怀疑态度,但不确定,因为加载了异物,但它们的 ID 为空。

附言我在 AppDbContext 中声明的项目如下:

    public DbSet<Project> Projects { get; set; }

ASP.NET MVC:空外键 ID 会导致验证错误

问题是我错过了外键的 ID 属性的 setter/getter:

public class Project
{
    public int Id { get; set; }
    [Required]
    [StringLength(100, MinimumLength = 5]
    public string Name { get; set; }
    [Required]
    public virtual ApplicationUser Client { get; set; }

    [ForeignKey("Client")]
    public string ClientID{ get; set; } //<--fixed 

    [Required]
    public virtual ApplicationUser ProjectManager { get; set; }

    [ForeignKey("ProjectManager")]
    public string ProjectManagerID { get; set; } //<--fixed 
    [Range(0,100)]
    [Required]
    public int Progress { get; set; }
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime CreateDate { get; set; }
    [Column("Disabled")]
    public bool Disabled{ get; set; }
    [Column("Status")]
    public string Status{ get; set; }
}