EF AddOrUpdate Seed不会更新子实体

我有一些问题种子数据,我能够用一个非常小的应用程序重现问题。
鉴于你有这种种子方法:

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’的整个目的。

我想我必须为每个子实体定义’keys’。 示例:’Junk’获取x => x.Name但’JunkItem’当前必须’更新密钥’集。 我假设这是问题所在,但我该如何处理呢?

EF中没有命令自动更新子级 – AddOrUpdate没有区别,它在内部检查顶级实体(在您的情况下是Junk )的存在,并插入或更新它(如果它不存在)。 在这种情况下插入子项是一个副作用,因为当AddOrUpdate内部调用Add它会添加整个对象树。 AddOrUpdate确实没有人们想象的那么神奇,但即使有这么少的魔法,它也只能用于迁移种子,因为它是非常昂贵的操作(每个实体的额外往返数据库和大量的reflection)。

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