EF AddOrUpdate Seed不会更新子实体

时间:2012-08-13 21:07:20

标签: 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!!!"
                }
            }
        );
    }

当您在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'目前必须'更新密钥'集。我假设这是问题所在,但我该如何处理呢?

1 个答案:

答案 0 :(得分:16)

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

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