gpt4 book ai didi

c# - EF AddOrUpdate 种子不更新子实体

转载 作者:可可西里 更新时间:2023-11-01 07:45:57 25 4
gpt4 key购买 nike

我在播种数据时遇到了一些问题,我能够通过一个非常小的应用程序重现该问题。
假设你有这个种子方法:

    protected override void Seed(JunkContext context)
{
context.Junks.AddOrUpdate(x => x.Name,
new Junk()
{
Name = "BANANAS!!",
Item = new JunkItem()
{
Name = "APPLES!!!"
}
}
);
}

当您在 PMC 中运行 update-database 时,所有实体都会成功创建。很好。
但是当你想去更新数据库时,说你的种子方法现在是这样的:

    protected override void Seed(JunkContext context)
{
context.Junks.AddOrUpdate(x => x.Name,
new Junk()
{
Name = "BANANAS!!",
Item = new JunkItem()
{
Name = "ORANGES!!!"
}
}
);
}

子实体未更新。似乎我们可以重新播种的唯一方法是删除数据库并重新播种所有内容。我想我明白为什么这不能像我期望的那样工作,但也许有人可以指出正确的方向来相应地更新这个种子方法。我知道我可以写出 context.JunkItems。 (...) 但这似乎会破坏“AddOrUpdate”的全部目的。

我想我必须为每个子实体定义“键”。示例:'Junk' 获取 x => x.Name 但 'JunkItem' 当前必须设置 'update key'。我假设这就是问题所在,但我将如何处理它?<​​/p>

最佳答案

EF 中没有命令自动更新子项 - AddOrUpdate 没有区别,它在内部检查是否存在顶级实体(在您的情况下为 Junk)并插入或更新它如果它不存在。在这种情况下,子项的插入是一个副作用,因为当 AddOrUpdate 内部调用 Add 时,它会添加整个对象树。 AddOrUpdate 的魔力确实比人们预期的要少得多,但即使有这么小的魔力,它也应该只用于迁移种子,因为它是非常昂贵的操作(每个实体和许多实体的额外往返数据库)反射(reflection))。

子项必须始终单独更新 - 它可能需要您自己单独查询数据库以找到正确的子项和常见的 EF 更新。

关于c# - EF AddOrUpdate 种子不更新子实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11942325/

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