【发布时间】:2015-12-17 15:30:07
【问题描述】:
如果我有两个模型(Post 和 Comment,其中一个 Post 可以有许多 cmets)并且在我的 Post 控制器中我有一个“LeaveComment”方法......为什么 ModelState.IsValid 在这个方法中返回 true,但是然后 db. SaveChanges() 抛出 DbEntityValidationException?
ModelState.IsValid 是否只检查 Post 的有效性,而不检查正在创建的 Comment 的有效性?
下面是我的部分代码。
编辑:我也很可能完全采取了错误的方法
控制器:
public class PostsController : Controller
{
private MyEntityModelContainer db = new MyEntityModelContainer();
[HttpPost, ActionName("LeaveComment")]
[ValidateAntiForgeryToken]
public ActionResult LeavePostComment(int? id, string CommentText)
{
Post post = db.Posts.Find(id);
post.LeaveComment(db, CommentText);
if (ModelState.IsValid)
{
//Evaluates to true!
db.Entry(post).State = System.Data.Entity.EntityState.Modified;
db.SaveChanges(); //throws DbEntityValidationException
}
}
}
评论模型:
public partial class Comment
{
public Comment () {}
public Comment(string comment)
{
this.CommentText = comment;
}
[Required(ErrorMessage="You must enter a comment")]
public string CommentText { get; set; }
public virtual Post Post { get; set; }
}
后模型:
public partial class Post
{
public virtual ICollection<Comment> Comments { get; set; }
public void LeaveComment(MyEntityModelContainer db, string comment_text)
{
Comment comment = new Comment(comment_text);
this.Comments.Add(comment);
}
}
【问题讨论】:
-
查看 DbContext 的 ChangeSet 谁和什么未能通过验证。
-
与问题无关,为什么将 db 传递给 LeaveComment?为什么不在获取 Post 和调用 LeaveComment 之前检查有效性?
-
在
LeaveComment中,您没有将评论分配给帖子。我敢打赌你的数据库有一个外键约束(当然应该有。) -
Jack Hughes -- this.Comments.Add(comment) 应该将评论添加到帖子中,不是吗?
-
Andy Wiesendanger - 抱歉,在这种情况下传递 db 是不必要的,但在其他一些方法中使用了这些方法,而这些方法在试图解决这个问题时被忽略了。
标签: asp.net-mvc entity-framework asp.net-mvc-5 entity-framework-6