无法将模型保存回数据库

时间:2020-10-10 17:35:10

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

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

好像公共绑定的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" />

1 个答案:

答案 0 :(得分:1)

在调用SaveProjectChanges(Project project)方法时,您会将模型作为输入参数进行传递,但在内部却没有使用它。您是对的,您用Project dbProject = await _context.Project.FirstAsync(p => 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输入参数处于“已断开”状态,因此请确保已设置其数据库关键字字段,否则将在数据库中获得新记录而不是更新现有的。