0

我之前有一个更详细的问题,但我没有答案,我将以更简单的方式提出同样的问题:

我有一个带有另一个表的外键的 EF 数据库。 在此处输入图像描述

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

  1. 转到数据库并通过 id检索成员,返回 EF 成员对象
  2. 对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 完全分离。但这需要做很多工作才能将所有 EF 对象转换为我的单独类。我对吗?

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

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

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

4

1 回答 1

2

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

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();
            }
        }
于 2012-09-12T13:56:03.993 回答