来自MVC4中的Create()方法的奇怪行为 - 使用ID = 0设置新对象,保存为其他内容

时间:2013-02-17 19:24:49

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

我正在为两种情况调试此方法:一种是父母,另一种是父母。

如果没有父级,则新Person的id为0,但实际上从未实际保存到db。

如果有父对象,则此方法中新Person的id为0,但新记录将以正确的值(比表中的最高值多一个)插入到db中。

这里发生了什么?我知道我做错了什么,我只是不确定是什么。

我正在使用EF Codefirst。

控制器方法的代码:

[HttpPost]
public ActionResult Create(CreatePersonViewModel viewModel)
{
    if (ModelState.IsValid)
    {

        var parent = _db.Persons.FirstOrDefault(s => s.PersonId == viewModel.ParentId);

        var person = new Person() { Name = viewModel.Name };

        // if it has a parent, build new relationship
        if (parent != null)
        {
            person.Parent = parent;
            parent.Children.Add(person);
        };

        _db.Save();

        return RedirectToAction("detail", "person", new { personId = person.PersonId });
    }
    return View(viewModel);
}

2 个答案:

答案 0 :(得分:2)

  

如果没有父级,则新Person的id为0,但实际上从未实际保存到db。

那是因为你永远不会告诉EF它应该坚持实体。您只需创建一个new Person()即可。

你应该这样做:

dbContext.AddToPersons(person);

在致电dbContext.SaveChanges()之前。

如果有父作品,则person因与parent的关系而被保存。

更新

刚发生在我身上:如果您先执行代码,则可能没有数据上下文中的AddToPersons(...)方法。如果是这样,您可以改为使用dbContext.Persons.AddObject(person)

答案 1 :(得分:1)

您所指的事实是您对象的自动增量ID。它由您的ORM控制。您可以查看此question

您可以查看msdn

中的此链接
  

备注Refresh具有允许对象的双重目的   刷新数据源中的数据并作为机制   哪些冲突可以解决。有关更多信息,请参阅保存   更改和管理并发(实体框架)。订单中   刷新哪些对象是不确定的。刷新后   调用方法时,将始终更新对象的原始值   使用数据源值,但当前值可能会也可能不会   使用数据源值进行更新。这取决于   RefreshMode。 StoreWins模式意味着对象应该是   已更新以匹配数据源值。 ClientWins值意味着   只有对象上下文中的更改才会被保留,即使   数据源中还有其他更改。确保一个   对象已经被数据源端逻辑更新,你可以调用   调用SaveChanges后,使用StoreWins值刷新方法   方法