我有一个我想要编辑的项目模型。问题是我的所有者的外键在编辑后设置为null。
此外,当我在后期操作中创建项目时,我手动添加所有者。
我不明白为什么我编辑后我的外键被重置了,我不知道如何让它单独留下来。
这样做的正确方法是什么?
public class Project
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string OwnerId { get; set; }
[ForeignKey("OwnerId")]
public virtual ApplicationUser Owner { get; set; }
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("Id,Description,Name")] Project project)
{
if (id != project.Id)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(project);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!ProjectExists(project.Id))
return NotFound();
else
throw;
}
return RedirectToAction("Index");
}
return View(project);
}
答案 0 :(得分:3)
问题是您的[Bind]
属性告诉ModelBinder不将OwnerId
绑定回控制器中使用的Project
:
public async Task<IActionResult> Edit(int id, [Bind("Id,Description,Name")] Project project)
因此,当您保存OwnerId
时,您的Project
将为空,而EF将删除之前的所有者。
您可以使用视图中OwnerId
的隐藏字段向前一个所有者进行往返,并将其包含在[Bind]
属性中。
更简洁的方法是使用ViewModel作为postdata,从控制器中的数据库加载现有的Project
,只将要更新的属性从ViewModel映射到实体模型。然后,您不能覆盖您不明确要覆盖的实体模型的任何属性。