对象未与db.SaveChanges ASP.NET MVC 4一起保存

时间:2014-07-12 12:43:04

标签: c# asp.net-mvc entity-framework asp.net-mvc-4

我正在尝试在MVC 4中构建一个Upvote函数以供注释,但这些upvotes不会添加到数据库中。我已经尝试在执行db.SingleOrDefault(x=> x.Id ==id)语句后使用db.SaveChanges再次创建对注释的搜索,并且一切似乎都有效,即upote就在那里。但是,一旦我再次请求控制,upvotes的值为null

编辑:我已解决了这个问题。似乎无法在Entity Framework中创建基本类型的集合,因此应该创建具有该基本类型的新类。

控制器:

    public class AJAXController : Controller
{
    //
    // GET: /AJAX/

    private BlogDb db = new BlogDb();

    //[Authorize]
    public ActionResult CommentUpvote(int id=0)
    {
        if (User.Identity.IsAuthenticated)
        {

            var comment = db.Commments.Find(id);
            if (comment != null)
            {
                if (comment.UserNamesUpVoted == null)
                {
                    comment.UserNamesUpVoted = new List<string>();
                }

                if (comment.UserNamesUpVoted.Contains(User.Identity.Name))
                {
                    comment.UserNamesUpVoted.Remove(User.Identity.Name);
                    comment.Points--;
                    ViewBag.c = "down";
                }
                else
                {
                    comment.UserNamesUpVoted.Add(User.Identity.Name);
                    comment.Points++;
                    ViewBag.c = "up";
                }

                db.Entry(comment).CurrentValues.SetValues(comment);
                db.SaveChanges();

            }
            else
            {
                ViewBag.c = "false2";
            }
        }
        else
        {
            ViewBag.c = "false1";
        }


        return View();
    }
}

评论类:

    public class Comments
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; } // this must be an int.

    public string Content { get; set; }

    public DateTime Created { get; set; }

    public int BelongsTo { get; set; } // null if does not belong, top comment.

    //[ForeignKey("UserProfile")]
    //public int UserId { get; set; }
    //public virtual UserProfile UserProfile { get; set; }

    public virtual ICollection<string> UserNamesUpVoted { get; set; }

    public int Points { get; set; }

    public virtual string UserName { get; set; }

}

1 个答案:

答案 0 :(得分:0)

我认为加载数据存在问题。使用Find方法没有发生急切加载,并且可能未加载相关数据。 Find仅返回您要查找的实体,如果它们尚未在对象缓存中,则不会自动加载其关联实体,因此您必须先正确加载UserNamesUpVoted然后对其进行修改:

var comment = db.Commments.Find(id); 
context.Entry(comment).Reference(c => c.UserNamesUpVoted).Load();

var comment = db.Commments.Include(c => c.UserNamesUpVoted).SingleOrDefault(c => c.Id == id);

之后修改评论:

db.Entry(comment).CurrentValues.SetValues(comment);
db.Entry(comment).State = EntityState.Modified;
db.SaveChanges();