【问题标题】:How to update entity?如何更新实体?
【发布时间】:2012-09-12 13:48:41
【问题描述】:

我之前有一个更详细的问题,我没有答案,我会用更简单的方法来问同样的问题:

我有一个带有另一个表的外键的 EF 数据库。

我想更新一个 ENTITY。但我需要这样,我会写下面的代码:

  1. 转到数据库并检索 id 的成员,返回 EF 成员对象
  2. 对对象OUTSIDE EF 上下文进行一些更改
  3. MODIFED EF 成员发送到 Save 方法中
  4. 在 BL 层保存方法使用上下文并保存更改。

1)

MemberManager currentMemberManager = new MemberManager();
Member NewMember = currentMemberManager.GetById(2);

2)

NewMember.FirstName = "NewFirstName";
NewMember.LanguageId = 1;

3)

currentMemberManager.Save(NewMember);

4)

public void Save2(Member newMember)
{
    using (var Context = new NoxonEntities())
    {
        Member existingMember = Context.Member.First(c => c.Id == newMember.Id);
        existingMember.FirstName = newMember.FirstName;
        existingMember.Language = Context.Language.First(c => c.Id == newMember.LanguageId);
        Context.SaveChanges();//In here I get the error below
    }
}

对数据库的更改已成功提交,但出现错误 更新对象上下文时发生。 ObjectContext 可能是 处于不一致的状态。内部异常消息:引用 发生完整性约束违规:属性值 定义引用约束之间不一致 关系中的主体和依赖对象。

注意:您可以建议发送不同的课程(例如:公共课程 MyMember) 具有所有必要的属性并且完全分离 来自英孚。但这需要做很多工作才能让所有 EF 对象转换 进入我的单独课程。我说的对吗?

我希望有一种方法可以分离实体,只要足够长的时间让我修改它并将值保存到数据库中。 (另外,我尝试了完全不更新行的 Detach 方法)

我已经尝试解决这个问题好几个小时了。

请帮助我更好地理解它,我真的需要一个解决方案。非常感谢任何有想法的人。

【问题讨论】:

  • 数据库中是否存在您为新成员设置的 ID 的语言?如果没有,您需要在保存更改之前将其添加到上下文中。
  • 是的。与 Language Id 相关的 Id 已经存在于 Language Table 上。所以不存在关系问题。
  • 代替Context.Member.First,也许你可以尝试使用Attach方法
  • 谢谢 Igoncalves .. Mark Oreta 提出了一些非常相似的建议,对我来说非常有效.. 我正在寻找一种方法从 EF 中窃取对象并将其再次发送回 EF,Mark 解决了我的问题。

标签: c# asp.net entity-framework-4


【解决方案1】:

您能否做一些简单的事情,例如分离实体,然后在准备保存时将其附加到上下文?

MemberManager currentMemberManager = new MemberManager();
Member NewMember = currentMemberManager.GetById(2);

得到:

public Member GetById(int id)
{ 
  var member = YourContext.Members.FirstOrDefault(m => m.id == id);
  YourContext.Detach(member);
  return member;
}

保存:

public void Save2(Member newMember)
        {
            using (var Context = new NoxonEntities())
            {
                Context.Attach(newMember);
                Context.ObjectStateManager.ChangeObjectState(newMember, EntityState.Modified);
                Context.SaveChanges();
            }
        }

【讨论】:

  • 天哪!就是这样!事实上正是它!...非常感谢马克!..我一直在努力解决这个问题!那么,当您通过会话检索对象以用于一般用途时,基本想法是从 EF 中分离吗?
  • 正确 - 获取实体,将其分离,以便您可以做您想做的事情,然后在需要时重新附加它以保存更改。这可以防止您的上下文存在时间过长。
  • 在使用分离和重新附加的实体时要小心,您可以并且会发现自己在以这种方式进行并发编辑时会发生冲突。 (2 个用户编辑相同的数据)用户 1 得到一个对象并开始编辑一个分离的实例。用户 2 也这样做。根据 ORM 行为,您可能会获得竞争条件(最后获胜)或版本不匹配错误。 (NHibernate,不确定 EF)通常最好重新加载实体并检查版本,然后将分离实体(或视图模型)中的值转录回“活动”实体。
猜你喜欢
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-26
相关资源
最近更新 更多