我正在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" />
答案 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
输入参数处于“已断开”状态,因此请确保已设置其数据库关键字字段,否则将在数据库中获得新记录而不是更新现有的。