16

我在播种数据时遇到了一些问题,我能够用一个非常小的应用程序重现该问题。
鉴于您有此种子方法:

    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”的全部目的。

我想我必须为每个子实体定义“键”。示例:“垃圾”获取 x => x.Name 但“垃圾项目”当前必须设置“更新密钥”。我假设这是问题所在,但我将如何处理呢?

4

1 回答 1

17

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

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

于 2012-08-14T09:50:12.813 回答