我是EF核心的新手,并按照本教程getting started with EF
创建了一个测试项目这是一个包含一些帖子的博客。
我已经更新了Edit GET方法以包含帖子
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var blog = await _context.Blog.Include(x => x.Post).SingleOrDefaultAsync(x => x.BlogId == id);
if (blog == null)
{
return NotFound();
}
return View(blog);
}
我已经更新了模型,以便能够对帖子进行索引。
public partial class Blog
{
public Blog()
{
Post = new List<Post>();
}
public int BlogId { get; set; }
public string Url { get; set; }
public virtual IList<Post> Post { get; set; }
}
在我的Edit.cshtml中,我添加了此部分以显示帖子:
@for (int i = 0; i < Model.Post.Count; i++)
{
<div class="form-group">
<label asp-for="Post[i].Title" class="control-label"></label>
<input asp-for="Post[i].Content" class="form-control" />
</div>
}
但是,当我尝试更新更新的Post对象时,它只是被添加到集合中,而不是更新现有对象。这意味着我的帖子每次更新都会加倍。
这是我的Edit POST方法。我已检查Blog的值在posts集合中是否包含正确的值。
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("BlogId,Url,Post")] Blog blog)
{
if (id != blog.BlogId)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(blog);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!BlogExists(blog.BlogId))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(blog);
}
我在做什么错了?
答案 0 :(得分:0)
PostId
似乎没有隐藏的输入字段,因此POST操作中属于Blog的帖子被视为新记录并插入。
<div class="form-group">
<input type="hidden" asp-for="Post[i].PostId" />
<label asp-for="Post[i].Title" class="control-label"></label>
<input asp-for="Post[i].Content" class="form-control" />
</div>