gpt4 book ai didi

c# - 使用 GraphDiff 更新多对多关联

转载 作者:行者123 更新时间:2023-11-30 16:59:18 25 4
gpt4 key购买 nike

我有以下数据模型:

Data Model

我的业务逻辑与分离的实体一起工作,因此我使用 GraphDiff 来执行更新。我在更新 PerfModes/CalcPoints 关联时遇到问题。从概念上讲,Block 拥有 CalcPoints 和 PerfModes,但 CalcPoints 可以与任意数量的 PerfModes 关联。

我正在尝试在 block 级别进行更新。我想出的代码没有抛出任何错误(而其他尝试则抛出错误)但它也没有更新 PerfModes/CalcPoints 关联。

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/CalcPoints 关联?

编辑

在查看了 andyp 的回答后,我从 GitHub 上下载了最新版本的 GraphDiff 并尝试了以下映射:

container.UpdateGraph(block, map => map
.OwnedCollection(b => b.CalcPoints)
.OwnedCollection(b => b.PerfModes,
with => with.AssociatedCollection(pm => pm.CalcPoints)));

这正确地更新了我的 PerfModes/CalcPoints 关联。我切换回我原来的映射,仍然看到关联没有更新的问题,所以尝试一次更新整个模型似乎有问题。我可以进行多次 UpdateGraph 调用,但分解它们的最佳方法是什么?

Here's具有相关代码和失败的单元测试的要点。

我正在继承 EF 生成的容器类来创建我自己的上下文,同时禁用代理创建。这会导致 GraphDiff 出现问题吗?

最佳答案

由于您的映射似乎是正确的,所以我尝试重现您的问题:

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]);
}

所有实体都是简单的 POCO,带有一个 int 键和 IDbSet<T>s在我的 DbContext .我没有在 OnModelCreating(..) 中添加任何内容通过流畅的 API,也没有在导航属性上使用任何属性。

我上面的代码工作正常,所以我有几个建议/问题:

  • 有什么(重要的)你做的和我上面的不一样吗?
  • 你调用SaveChanges()吗在 UpdateGraph() 之后?这不是暗示!
  • 你有最新版本的 GraphDiff 吗?请注意,NuGet 包已经过时了,最好从 Github 获取当前源。并自己构建。
  • 如果您的问题仍然存在,请使用无效的确切场景更新您的问题:请包括您的 DbContext 的状态打电话前UpdateGraph() ,您期望 GraphDiff 进行的更改以及它无法进行的更改。

编辑:毕竟您的映射不正确,您正在映射 Block.CalcPoints 两次,一次作为自有集合(第一次调用 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))
);

关于c# - 使用 GraphDiff 更新多对多关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23834083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com