首先是消息
对数据库的更改是 提交成功,但错误 更新对象时发生 上下文。 ObjectContext可能在 不一致的状态。内部异常 消息:参照完整性 发生约束违规: 定义的属性值 参考约束不是 校长与校长一致 关系中的依赖对象。
当我尝试在entityframework中插入新数据时会发生问题
我的实体模型
在数据库中我将关系设置为删除和更新时级联。这是我对关系的唯一改变
我的行动方法:
[HttpPost]
public ActionResult CompleteRegisteration(RegisterViewModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
var user = new User
{
DisplayName = model.DisplayName,
FullName = model.Name,
Email = model.Email,
};
user.AuthenticationTokens.Add(new AuthenticationToken
{
ClaimedIdentifier = model.ClaimedIdentifier,
DisplayName = model.Email
});
_userRepository.InsertOrUpdate(user);
_userRepository.Save();
return RedirectToAction("Index", "Home");
}
和用户存储库方法:
private readonly StoryWritingEntities context = new StoryWritingEntities();
public void InsertOrUpdate(User user)
{
context.Users.Attach(user);
context.ObjectStateManager.ChangeObjectState(user,
user.Id == default(int)
? EntityState.Added // if true then this is a new entry
: EntityState.Modified); // if false this is an Existing entry
}
public void Save()
{
context.SaveChanges();
}
问题是由context.SaveChanges()
导致在users表中插入了一条记录,但在AuthenticationTokens表中没有插入任何内容
答案 0 :(得分:6)
如果您只是执行以下操作,则不会发生这种情况:
context.Users.AddObject(user);
content.SaveChanges();
我怀疑问题正在发生,因为EF不知道AuthenticationToken
对象,它没有附加到上下文,因为它被添加到断开连接的实体,然后附加到上下文。
您需要让EF处理整个对象图连接情况,或者您需要自己完成所有操作。像这样的混合和匹配不起作用。
答案 1 :(得分:1)
尝试不同的东西,例如:
if(model.Id != null)
{
UpdateModel(user);
}
else
{
_userRepository.Insert(model)
}
_userRepository.Save();
userRepository.Insert将是:
public void Insert(User user)
{
context.Users.AddObject(user);
}
答案 2 :(得分:0)
在数据库中我将关系设置为 删除和更新时级联
1)我相信如果你在数据库中直接设置级联删除,你还需要在模型中定义它。模型设计器中的设置位于相关关联的属性窗口中(单击设计器表面中两个实体之间的关联线,然后选择“属性”)。
2)我也相信EF不支持级联更新。尝试删除数据库中的更新级联,然后检查它是否有效。
答案 3 :(得分:0)
我得到了这个错误,因为我试图编辑一个表,但是代码添加了一个具有相同ID的行。
所以我刚刚改变了
ctx.table.Add(entity object);
太
ctx.Entry(entity object).State = EntityState.Modified;