当我使用模型第一个方法时,此代码工作正常。并且如果它是new Vote()
则停止保存投票。我猜模型第一次生成的类在属性设置器上使用了一些“魔法”,我认为这是我们在代码优先属性中放置virtual
的内容。有没有办法使它的旧式工作?或者我应该以其他方式搜索和替换并将新对象绑定到图形上?
public ActionResult Vote(int id, string votetype)
{
int userid = ViewBag.User.Id;
var pub = DB.Publications.Single(p => p.Id == id);
var votes = pub.Votes.SingleOrDefault(v => v.MemberId == userid) ??
new Vote
{
MemberId = userid,
Publication = pub
};
DB.SaveChanges();
return RedirectToAction("Full", new { id = id });
}
答案 0 :(得分:4)
之前有用,但它从一开始就写得不好,因为它确实使用了一些内部魔法,在你的例子中它可以被称为副作用。你应该避免通过副作用来做某些逻辑的代码。
神奇的是自动修复导航属性。您创建了一个新的Vote
并将其Publication
导航属性设置为附加到上下文的Publication
实例。在这种情况下,EF会为您修复关系,并在内部同时将Vote
添加到Publication
。由于修复了新Vote
,因此也会跟踪(作为新实体)。
首先在代码中使用的自定义类没有修复方法,除非您手动编写或从模型和数据库中首先使用的POCO T4模板生成的代码中复制它们。如果没有修复,新的Vote
将不会添加到上下文中,SaveChanges
将不会执行任何修改。
使用@ Diego的代码修复您的方法。
答案 1 :(得分:3)
在那段代码中你没有告诉EF坚持新的投票。
将获得/创建投票的行更改为:
var vote = pub.Votes.SingleOrDefault(v => v.MemberId == userid);
if (vote == null)
pub.Votes.Add(new Vote
{
MemberId = userid,
Publication = pub
});