Entity Framework 6.4:三级表关联绑定数据源后上下文跟踪失效求助
解决EF6.4中绑定指定Order下所有Item后变更无法保存的问题
需求可行性
完全可行,核心是要让EF上下文正确跟踪实体的关联关系和变更操作。
问题原因
你第二段代码用SelectMany直接提取Item列表,虽然数据能正常显示,但存在关键问题:
- 新增的Item未关联到对应的
OrderPosition,EF上下文无法识别它与Order的层级关系; - 删除Item时,仅从BindingList移除不会同步到对应的
OrderPosition.Item集合,EF无法感知删除操作; - 即使修改Item属性时EF能跟踪,关联关系的缺失也会导致变更无法被完整识别。
解决方案
1. 正确加载关联实体
先完整加载目标Order及其所有关联的OrderPosition和Item,确保所有实体都被EF上下文跟踪:
' 加载包含级联关联的Order实体 Dim targetOrder = Await Task.Run(Function() _context.Order _ .Include(Function(o) o.OrderPositions.Select(Function(op) op.Item)) _ .FirstOrDefault(Function(o) o.IdOrder = Order_ID)) ' 收集该Order下的所有Item Dim allItems = targetOrder.OrderPositions.SelectMany(Function(op) op.Item).ToList() ' 绑定到BindingSource BindingSourceItems.DataSource = New BindingList(Of DataModel.Item)(allItems)
2. 处理修改操作
此时修改DataGridView中Item的属性,EF上下文会自动跟踪这些变更,直接调用保存方法即可:
Await _context.SaveChangesAsync()
3. 处理新增Item
新增Item时必须关联到对应的OrderPosition,否则EF无法识别它的归属层级:
' 创建新Item并设置属性 Dim newItem = New DataModel.Item() newItem.ItemName = "新增商品" newItem.Price = 19.99 ' 选择该Item所属的OrderPosition(示例选第一个,实际可让用户选择) Dim targetOp = targetOrder.OrderPositions.First() ' 将新Item关联到OrderPosition的集合中 targetOp.Item.Add(newItem) ' 同步到BindingList以显示 CType(BindingSourceItems.DataSource, BindingList(Of DataModel.Item)).Add(newItem)
4. 处理删除Item
删除时需要同时从OrderPosition.Item集合和EF上下文移除:
Dim selectedItem = CType(BindingSourceItems.Current, DataModel.Item) ' 找到该Item所属的OrderPosition Dim parentOp = targetOrder.OrderPositions.FirstOrDefault(Function(op) op.Item.Contains(selectedItem)) If parentOp IsNot Nothing Then ' 从OrderPosition的集合中移除 parentOp.Item.Remove(selectedItem) ' 告知EF上下文删除该实体 _context.Item.Remove(selectedItem) End If ' 从BindingList中移除 CType(BindingSourceItems.DataSource, BindingList(Of DataModel.Item)).Remove(selectedItem)
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

