从Model First迁移到Code First,一些重大变化

时间:2011-07-04 16:21:54

标签: asp.net-mvc entity-framework ef-code-first

当我使用模型第一个方法时,此代码工作正常。并且如果它是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 });
}

2 个答案:

答案 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
                  });