ASP.NET MVC数组键非空的

问题描述:

所以我有2种型号的设置是这样的:ASP.NET MVC数组键非空的

class Job { ... List<Restriction> userRestrictions {set; get; ... } 

第二型号:

Restriction { public int Id { get; set; } ... public int JobID { get; set; } } 

现在,当我编辑的工作,我通过取限制:

job = db.Jobs.Where(i => i.Id == id).Include(r => r.UserRestrictions).First(); 

所以我通过UserRestrictions迭代并手动使其:

 @for (ind = 0; ind < Model.UserRestrictions.Count; ind++) 
     { 
      JaASv1.Models.Restriction p = Model.UserRestrictions[ind]; 
     <tr> 
      <td> 
       <input type="hidden" name="UserRestrictions[@(Counter + ind)].Id" value="@p.Id" /> 
       <input type="hidden" name="UserRestrictions[@(Counter + ind)].JobId" value="@Model.Id" /> 
      </td> 

我POST方法:

  public ActionResult Edit(Job job, string ProjTypeOther, string VenderOther, string FoldingOther, string BindingOther) 
      ... 
      db.Entry(job).State = EntityState.Modified; 
      ... 
      for (int iter = iterStart; iter >= 0; iter--) 
      { 
       Restriction r = job.UserRestrictions[iter]; 

       db.Entry(r).State = EntityState.Modified; 

       if (r.Permissions == 0) 
       { 
        DelPermission(sPath, r.AdName); // Folder Permission things 
        job.UserRestrictions.Remove(r); 

        continue; 

       } 
       else if (r.Permissions == 1) 
       { 
        AddPermission(sPath, r.AdName, readRights); // Folder Permission things 
       } 
       else if (r.Permissions == 2) 
       { 
        AddPermission(sPath, r.AdName, writeRights); // Folder Permission things 
       } 



      } 

      db.SaveChanges(); 

我得到db.SaveChanges()以下错误:

的关系无法改变,因为一个或多个 外键的属性是不可空的。

我查看了所有job.UserRestrictions并看到他们都有他们的JobID张贴,我甚至看了数据库上下文,并看到没有任何外键其中有NULL,所以我没有知道这个错误在说什么。

我可能做错了什么?

我试着将每个限制状态设置为修改。这似乎并不奏效。

我愿意接受任何建议。

谢谢!

+0

请出示实际的代码,你的程序给出错误。 – 2013-02-18 20:17:19

+0

好吧,错误本身发生在db.SaveChanges();但我会展示我如何处理发布的帖子对象 – dab 2013-02-18 20:19:58

所以,我最后做的是以下几点:

在数据库目前拉动所有UserRestrictions。

通过迭代发布数据,我检查数据库中的相应项目。我还将Post对象中的UserRestrictions设置为null,以便ASP不尝试重新插入表中。

如果该项目不存在,我将该项目添加到数据库中。

我修改数据库中的项目而不是后期数据。

我希望ASP.NET能够为我处理所有事情,但我想我不能期望它能完成所有工作。

List<Restriction> fromDB = db.Restrictions.Where(r => r.JobId == job.Id).ToList(); 
List<Restriction> newPost = job.UserRestrictions; 
job.UserRestrictions = null; 
for (int iter = iterStart; iter >= 0; iter--) { 
... // Logic to handle post item 
    Restriction b; 
    try 
    { 

     b = fromDB.Where(f => f.Id == r.Id).First(); 
    } 
    catch (Exception er) 
    { 
     // No record exists yet 
     b = r; 
     db.Restrictions.Add(b); 
     } 
     // Modify values of b to the values from post data 
    } 
    db.SaveChanges(); 

对不起,怪压痕,StackOverflow上应该使用,而不是设置高亮空白:X