gpt4 book ai didi

entity-framework - 无法获取要更新 Entity Framework 中导航属性的关系

转载 作者:行者123 更新时间:2023-12-04 13:34:02 26 4
gpt4 key购买 nike

我目前正在使用 EF4.3 和 Code First。我的对象的创建工作(通过我的 View - 仅使用自动生成的创建),但是当我尝试编辑一个对象时,它不会保存任何最终与我的导航属性相关的更改。我一直是reading on relationships ,但我不明白如何告诉我的上下文关系已经改变。

这是我的实现的一些示例代码。

@* Snippet from my view where I link into my ViewModel. *@
<div class="row">
<div class="editor-label">
@Html.LabelFor(model => model.ManagerID)
</div>
<div class="editor-field">
@Html.DropDownListFor(model => model.ManagerID, ViewBag.Manager as SelectList, String.Empty)
@Html.ValidationMessageFor(model => model.ManagerID)
</div>
</div>

这是我的 Controller 实现(我的编辑的 POST):
    [HttpPost]
public ActionResult Edit(ProjectViewModel projectViewModel)
{
if (ModelState.IsValid)
{
Project project = new Project();
project.ProjectID = projectViewModel.ProjectID;
project.Name = projectViewModel.Name;
project.ProjectManager = repository.GetUser(projectViewModel.ManagerID);
repository.InsertOrUpdateProject(project);
repository.Save();
return RedirectToAction("Index");
}
ViewBag.Manager = new SelectList(repository.GetUsers(), "UserID", "FullName", projectViewModel.ManagerID);
return View(projectViewModel);
}

在我的项目对象中:
public class Project
{
public int ProjectID { get; set; }
[Required]
public string Name { get; set; }

// Navigation Properties
public virtual User Manager { get; set; }
}

这是存储库中的相应方法(我的上下文所在的位置):
public void InsertOrUpdateProject(Project project)
{
if (program.ProjectID == default(int))
{
context.Projects.Add(project);
}
else
{
context.Entry(project).State = EntityState.Modified;
}
}

需要明确的是,这确实可以更新我的属性,但不会更新我的导航属性(在本例中为 Manager)。感谢任何帮助。

最佳答案

将状态设置为 Modified仅将标量属性标记为已修改,而不是导航属性。你有几个选择:

  • 一个黑客(你不会喜欢它)
    //...
    else
    {
    var manager = project.Manager;
    project.Manager = null;
    context.Entry(project).State = EntityState.Modified;
    // the line before did attach the object to the context
    // with project.Manager == null
    project.Manager = manager;
    // this "fakes" a change of the relationship, EF will detect this
    // and update the relatonship
    }
  • 从数据库重新加载项目,包括(急切加载)当前管理器。然后设置属性。更改跟踪将再次检测到管理器的更改并写入 UPDATE。
  • 公开 Manager 的外键属性模型中的导航属性:
    public class Project
    {
    public int ProjectID { get; set; }
    [Required]
    public string Name { get; set; }

    public int ManagerID { get; set; }
    public virtual User Manager { get; set; }
    }

    现在ManagerID是一个标量属性并将状态设置为 Modified将包括此属性。此外,您不需要从数据库中加载 Manager 用户,您只需分配从 View 中获得的 ID:
    Project project = new Project();
    project.ProjectID = projectViewModel.ProjectID;
    project.Name = projectViewModel.Name;
    project.ManagerID = projectViewModel.ManagerID;
    repository.InsertOrUpdateProject(project);
    repository.Save();
  • 关于entity-framework - 无法获取要更新 Entity Framework 中导航属性的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9606866/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com