2016-03-04 42 views
0

短篇小说:ASP.NET MVC:空外键ID导致验证错误

我从数据库加载模型实例,将更改应用到它,但是当我想更新的变化,验证异常的发生在模型定义中设置为[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 

这是事实,当我从数据库,客户端ID和ProjectManagerID立朗科技信息为空造成的,如果我手动设置如下,这将解决:

  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为空。

P.S.我宣布AppDbContext项目如下:

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

回答

0

的问题是,我错过了二传手/ getter方法ForeignKeys的ID属性:

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; } 

}