【问题标题】:error occurred while updating the object context更新对象上下文时出错
【发布时间】:2011-08-05 01:50:24
【问题描述】:

这里首先是消息

对数据库的更改是 提交成功,但报错 更新对象时发生 语境。 ObjectContext 可能在 不一致的状态。内部异常 消息:参照完整性 发生约束冲突: 定义的属性值 引用约束不是 主和之间一致 关系中的依赖对象。

当我尝试在实体框架中插入新数据时会出现问题


我的实体模型

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


我的行动方法:

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

【问题讨论】:

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


    【解决方案1】:

    如果您只是执行以下操作,则不会发生这种情况:

      context.Users.AddObject(user);
      content.SaveChanges();
    

    我怀疑问题正在发生,因为 EF 不知道 AuthenticationToken 对象,它没有附加到上下文,因为它被添加到断开连接的实体,然后附加到上下文。

    您要么需要让 EF 处理整个对象图的连接情况,要么您需要自己完成这一切。像这样混合和匹配是行不通的。

    【讨论】:

    • context.Users.Add(user) 位是否允许 EF 处理整个对象图?
    【解决方案2】:

    尝试不同的东西,例如:

    if(model.Id != null)
    {
        UpdateModel(user);
    }
    else
    {
        _userRepository.Insert(model)
    }
    _userRepository.Save();
    

    而 _userRepository.Insert 将是:

    public void Insert(User user)
    {
        context.Users.AddObject(user);
    }
    

    【讨论】:

      【解决方案3】:

      我收到此错误是因为我试图编辑表中的记录/行,但代码添加了具有相同 ID 的行。

      所以我只是改变了

      ctx.table.Add(entity object);
      

      ctx.Entry(entity object).State = EntityState.Modified;
      

      【讨论】:

        【解决方案4】:

        在数据库中,我将关系设置为 级联删除和更新

        1) 我相信如果您直接在数据库中设置级联删除,您还需要在模型中定义它。模型设计器中的设置在相关关联的属性窗口中(点击设计器图面中两个实体之间的关联线,然后选择“属性”)。

        2) 我也相信 EF 不支持更新级联。尝试在数据库中删除更新时的级联,然后检查它是否有效。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-27
          • 1970-01-01
          • 2019-08-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多