1

所以我有两个这样的模型设置:

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>

我的发帖方式:

            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 的外键,所以我不知道这个错误在说什么关于。

我可能做错了什么?

我尝试将每个限制状态设置为已修改。那似乎没有用。

我愿意接受任何建议。

谢谢!

4

1 回答 1

0

所以,我最终做的是以下内容:

拉取当前在数据库中的所有 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 应该使用 bbcode 而不是空格:x

于 2013-02-19T18:53:10.053 回答