我正在为两种情况调试此方法:一种是父母,另一种是父母。
如果没有父级,则新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);
}
答案 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值刷新方法 方法