我的数据库实体模型中有三个表:
我可以在帖子中添加多个类别。因此,表格可以多对多。
我可以添加一个包含多个类别的新帖子。没问题。
CreatePost
行动:
[HttpPost]
public ActionResult CreatePost(Post post, int[] categories)
{
post.CreatedDate = DateTime.Now;
foreach (var category in categories)
{
post.Categories.Add(db.Categories.Find(category));
}
db.Posts.Add(post);
db.SaveChanges();
// Get categories from ListBox
ViewData["Categories"] = new MultiSelectList(db.Categories.Select(c => new CategoryViewModel()
{
CategoryId = c.CategoryId,
CategoryName = c.Name
}), "CategoryId", "CategoryName");
return View(post);
}
但我无法从帖子中更新类别。我无法得到错误,但它无法正常工作。
EditPost
:
[HttpPost, ActionName("EditPost"), ValidateInput(false)]
public ActionResult EditPost(Post post, int[] categories)
{
ViewData["Categories"] = new MultiSelectList(db.Categories.Select(c => new CategoryViewModel()
{
CategoryId = c.CategoryId,
CategoryName = c.Name
}), "CategoryId", "CategoryName");
post.CreatedDate = DateTime.Now;
// Clear all categories.
post.Categories.Clear();
foreach (var category in categories)
{
// Add new categories.
post.Categories.Add(db.Categories.Find(category));
}
db.Entry(post).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Posts");
}
编辑帖子时,类别不会更新。我没有得到任何错误。我怎样才能做到这一点?请帮助..
答案 0 :(得分:1)
原因是在EF可以跟踪对它的更改之前必须加载post.Categories
。
db.Entry(post).State = EntityState.Modified; // Also attaches post to the context
db.Entry(post).Collection(p => p.Categories).Load();
// Clear all categories.
post.Categories.Clear();
// and so on
顺便说一下,如果帖子更新而未创建,您确定post.CreatedDate = DateTime.Now;
吗?
答案 1 :(得分:0)
保存任何内容的可能原因是SaveChanges没有找到任何保存更改。因此,它什么都不做,并且没有错误消息。
尝试在添加类别之前将帖子附加到上下文。或者在类别上设置状态:
foreach (var cat in post.Categories)
this.Entry(cat).State = EntityState.Modified;