我正在尝试在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; }
}
答案 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();