【问题标题】:Unable to save model back to database无法将模型保存回数据库
【发布时间】:2021-01-25 11:58:56
【问题描述】:

我正在 RazorPage 中为我的项目模型进行简单的编辑操作。我可以读取数据并编辑模型中的数据,但无法将其保存回数据库。

好像公共绑定的 Project 变量突然不再链接到数据库上下文。在 OnPost() 中,绑定的 Project 变量似乎与 await _context.Project.FirstAsync(p => p.Id == project.Id); 中的变量不一样了?

代码:

     public class EditProjectModel : PageModel
        {
            [BindProperty]
            public Project Project { get; set; }
    
            ...
    
            private async Task SaveProjectChanges(Project project) // How to save this parameter back into the database?
            {
                Project dbProject = await _context.Project.FirstAsync(p => p.Id == project.Id);
                // How to save the changes from project?
                // I don't want to assign each property manually like so: dbProject.Name = project.Name
                // dbProject = project; // Erm yeah... This is obviously pointless unless I can use a pointer or something... But there's got to be a better way.
                await _context.SaveChangesAsync();
            }
    
            public async Task<IActionResult> OnPost()
            {
                if (Project.Id > 0)
                {
                    await SaveProjectChanges(Project);
                }
                else
                {
                    await AddNewProject(Project);
                }
    
                return RedirectToPage(<snip>);
            }

如果重要,请从视图中截取:

    <tr>
        <td>Id</td>
        <td>@Model.Project.Id<input type="hidden" name="Project.Id" value="@(Model.Project.Id)" /></td>
    </tr>
    <tr>
        <td>Name</td>
        <td><input type="text" name="Project.Name" value="@(Model.Project.Name)" /></td>
    </tr>

    ...

    <input type="submit" value="Save" class="btn btn-default" />

【问题讨论】:

    标签: c# asp.net-core .net-core entity-framework-core razor-pages


    【解决方案1】:

    当调用 SaveProjectChanges(Project project) 方法时,您将模型作为输入参数传递,但在内部您并没有使用它。你是对的,你用Project dbProject = await _context.Project.FirstAsync(p =&gt; p.Id == project.Id); 拉取的对象与输入参数不同,它是另一个实例。

    为了更新数据库记录,您需要使用 DbContext 的 Update() 方法作为 _context.Update(project); - official docs

    所以你的 SaveProjectChanges 方法最终应该看起来像这样:

    private async Task SaveProjectChanges(Project project)
    {
        _context.Update(project);
        await _context.SaveChangesAsync();
    }
    

    注意:由于您的 Project 输入参数处于“断开连接”状态,请确保设置了其数据库键字段,否则您最终会在数据库中获得一条新记录,而不是更新现有的。

    【讨论】:

      猜你喜欢
      • 2012-12-18
      • 2017-10-11
      • 2021-12-09
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      相关资源
      最近更新 更多