我有以下数据模型:

我的业务逻辑与独立实体一起工作,因此我使用GraphDiff来执行更新。我在更新PerfModes/CalcPoint关联时遇到了问题。从概念上讲,块拥有CalcPoints和PerfModes,但是CalcPoints可以与任意数量的PerfModes相关联。
我正在试着在块级别进行更新。我想出的代码不会抛出任何错误(其他尝试也不会),但它也不会更新PerfModes/CalcPoint关联。
container.UpdateGraph(block, map => map
.OwnedCollection(b => b.HistPoints)
.OwnedCollection(b => b.CalcPoints)
.OwnedCollection(b => b.PerfModes, with => with
.OwnedCollection(p => p.FilterCriterion, with2 => with2
.OwnedCollection(fc => fc.Filters, with3 => with3
.AssociatedEntity(f => f.OperatorType)
.AssociatedEntity(f => f.CalcPoint))))
.AssociatedCollection(p => p.CalcPoints)
);我可能没有完全掌握EF图和GraphDiff。如何确保多到多PerfModes/CalcPoint关联得到正确更新?
编辑
在查看了andyp的答案之后,我从GitHub中提取了最新版本的GitHub,并尝试了以下映射:
container.UpdateGraph(block, map => map
.OwnedCollection(b => b.CalcPoints)
.OwnedCollection(b => b.PerfModes,
with => with.AssociatedCollection(pm => pm.CalcPoints)));这正确地更新了我的PerfModes/CalcPoint关联。我切换回原来的映射,仍然看到关联没有更新的问题,因此尝试立即更新整个模型是有问题的。我可以打多个UpdateGraph电话,但是最好的方法是什么呢?
下面是是一个包含相关代码和失败单元测试的gist。
我正在继承EF生成的容器类,以便在禁用代理创建的情况下创建自己的上下文。这会导致GraphDiff出现问题吗?
发布于 2014-05-24 10:33:20
由于您的映射似乎是正确的,所以我尝试这样复制您的问题:
var calcPoint = new CalcPoint();
var block = new Block
{
CalcPoints = new List<CalcPoint> {calcPoint},
PerfModes = new List<PerfMode>
{
new PerfMode {CalcPoints = new List<CalcPoint> {calcPoint}}
}
};
using (var context = new TestDbContext())
{
context.UpdateGraph(block, map => map
.OwnedCollection(b => b.CalcPoints)
.OwnedCollection(b => b.PerfModes,
with => with.AssociatedCollection(pm => pm.CalcPoints)));
context.SaveChanges();
}
using (var context = new TestDbContext())
{
var reloaded = context.Blocks.Include("PerfModes.CalcPoints").Single();
Assert.AreEqual(1, reloaded.CalcPoints.Count);
Assert.AreEqual(1, reloaded.PerfModes.Count);
Assert.AreEqual(1, reloaded.PerfModes[0].CalcPoints.Count);
Assert.AreEqual(reloaded.CalcPoints[0], reloaded.PerfModes[0].CalcPoints[0]);
}所有实体都是带有int键的简单POCOs,只有IDbSet<T>s在我的DbContext上。我既没有通过fluent API在OnModelCreating(..)中添加任何内容,也没有在导航属性上使用任何属性。
上面的代码运行正常,因此我有几个建议/问题:
UpdateGraph()之后打电话给UpdateGraph()吗?这不是暗示!DbContext之前包括UpdateGraph()的状态、您希望GraphDiff进行的更改以及它未能完成的更改。编辑:您的映射毕竟是不正确的,您正在映射Block.CalcPoints 2次,一次作为一个拥有的集合(第一次调用OwnedCollection(..)),一次作为关联集合(最后一次也是唯一一次对AssociatedCollection(..)的调用)。因此,您从未告诉GraphDiff映射PerfModes.CalcPoints,而它也从不更新该集合。;-)
要要求GraphDiff这样做,请从最后一行的末尾移动一个)到最后一行的末尾,这样就可以了(在缩进与括号匹配之后)。正确的映射如下(最后一行末尾的两个结束括号):
container.UpdateGraph(block, map => map
.OwnedCollection(b => b.HistPoints)
.OwnedCollection(b => b.CalcPoints)
.OwnedCollection(b => b.PerfModes, with => with
.OwnedCollection(p => p.FilterCriterion, with2 => with2
.OwnedCollection(fc => fc.Filters, with3 => with3
.AssociatedEntity(f => f.OperatorType)
.AssociatedEntity(f => f.CalcPoint)))
.AssociatedCollection(p => p.CalcPoints))
);https://stackoverflow.com/questions/23834083
复制相似问题