EF AddOrUpdate Seed不会更新子实体

Pea*_*nut 15 c# entity-framework ef-migrations

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

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

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

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

子实体未更新.似乎我们可以重新播种的唯一方法是擦除数据库并重新设置所有内容.我想我理解为什么这不能按我期望的方式工作,但也许有人可以指出我正确的方向来相应地更新这种种子方法.我知道我可以写出context.JunkItems.(...)但似乎它会击败'AddOrUpdate'的整个目的.

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

Lad*_*nka 16

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

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

  • 感谢您的投入.我只是想避免为所有这些孩子创建一个新变量.我创建了一个名为"AddOrUpdateChild"的扩展方法,它只调用"AddOrUpdate",然后返回给定的T实例.这样,您可以手动"AddOrUpdate"您的子实例并将所有外键设置为内联.到目前为止,在初始测试期间,它已被证明是成功的. (2认同)