MVC 6使用外键编辑模型

时间:2016-07-14 10:37:51

标签: asp.net-mvc asp.net-core-mvc

我有一个我想要编辑的项目模型。问题是我的所有者的外键在编辑后设置为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);
    }

1 个答案:

答案 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映射到实体模型。然后,您不能覆盖您不明确要覆盖的实体模型的任何属性。