所以我有2个模型设置如下:
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的外键,所以我不知道这是什么错误在谈论。
我可能做错了吗?
我尝试将每个限制状态设置为已修改。这似乎不起作用。
我愿意接受任何建议。
谢谢!
答案 0 :(得分: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