【发布时间】:2012-09-12 13:48:41
【问题描述】:
我之前有一个更详细的问题,我没有答案,我会用更简单的方法来问同样的问题:
我有一个带有另一个表的外键的 EF 数据库。
我想更新一个 ENTITY。但我需要这样,我会写下面的代码:
- 转到数据库并检索 id 的成员,返回 EF 成员对象
- 对对象OUTSIDE EF 上下文进行一些更改
- 将 MODIFED EF 成员发送到 Save 方法中
- 在 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