2

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

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

如果有父级,则在此方法中,新 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);
}
4

2 回答 2

1

您所指的事实是您对象的自动递增 ID。它由您的 ORM 控制。你可能想检查这个问题

您可能想从msdn检查此链接

备注 Refresh 具有双重目的,即允许使用来自数据源的数据刷新对象,并且是解决冲突的机制。有关更多信息,请参阅保存更改和管理并发(实体框架)。刷新对象的顺序是不确定的。调用 Refresh 方法后,对象的原始值将始终使用数据源值更新,但当前值可能会或可能不会使用数据源值更新。这取决于 RefreshMode。StoreWins 模式意味着应该更新对象以匹配数据源值。ClientWins 值意味着只有对象上下文中的更改将被持久化,即使数据源中有其他更改。

于 2013-02-17T19:26:15.967 回答
1

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

那是因为您从不告诉 EF 它应该保留实体。你只创建一个new Person(),就是这样。

你应该做:

dbContext.AddToPersons(person);

打电话之前dbContext.SaveChanges()

在有父对象的情况下,person由于与 的关系而被保存parent

更新

我突然想到:如果您先编写代码,您可能没有AddToPersons(...)在数据上下文中可用的方法。如果是这样,您可以dbContext.Persons.AddObject(person)改用。

于 2013-02-17T19:43:17.820 回答