更新对象上下文时发生错误

时间:2011-04-13 21:21:02

标签: c# .net entity-framework exception-handling

首先是消息

  

对数据库的更改是   提交成功,但错误   更新对象时发生   上下文。 ObjectContext可能在   不一致的状态。内部异常   消息:参照完整性   发生约束违规:   定义的属性值   参考约束不是   校长与校长一致   关系中的依赖对象。

当我尝试在entityframework中插入新数据时会发生问题


我的实体模型

enter image description here

在数据库中我将​​关系设置为删除和更新时级联。这是我对关系的唯一改变


我的行动方法:

[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表中没有插入任何内容

4 个答案:

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