比方有会话CtxA中的A对象以及CxtB中的B对象,
new 一个A对象,设置A.B=B,那么当将A添加到CtxA中时(代码:CtxA.A.AddObject(A))如果CtxA中不包括B对象那么将报错误:
只有在 EntityKey 属性的当前值为 null 时才能设置该属性。
如果CtxA中存在B对象那么将报错误:
ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象
解决办法:
View Code
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对应的物料组显示时才会触发(滚动条拉过去)