EF 中不同会话上下文的对象,不能互设为对方的导航属性值
比方有会话CtxA中的A对象以及CxtB中的B对象,
new 一个A对象,设置A.B=B,那么当将A添加到CtxA中时(代码:CtxA.A.AddObject(A))如果CtxA中不包括B对象那么将报错误:
只有在 EntityKey 属性的当前值为 null 时才能设置该属性。
如果CtxA中存在B对象那么将报错误:
ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象
解决办法:

private void tbtnAddNewItem_Click(object sender, EventArgs e) { var item = bindingSource1.Current as KB_BOMTable; if (item != null && treeView1.SelectedNode != null) { //bGroup来自DBCtx以外的会话 var bGroup = treeView1.SelectedNode.Tag as KB_BOMGroup; if (bGroup != null) { item.KB_BOMGroup = DBCtx.GetObjectByKey(bGroup.EntityKey) as KB_BOMGroup; // item.GroupId = bGroup.GroupId; //只设置值属性,导航属性在改对象Attach到会话时自动加载 } } }
另外注意设置GroupId=2 后,如果该datagridview列没显示--指有很多列该列需要拉动滚动条才可见,
则不执行数据库查询加载编号是2的MGroup,而是当datagridview对应的物料组显示时才会触发(滚动条拉过去)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!