C# EF AddOrUpdate种子不更新子实体

C# EF AddOrUpdate种子不更新子实体,c#,entity-framework,entity-framework-migrations,C#,Entity Framework,Entity Framework Migrations,我在播种数据时遇到了一些问题,我能够用一个非常小的应用程序重现该问题。 如果您有此种子方法: protected override void Seed(JunkContext context) { context.Junks.AddOrUpdate(x => x.Name, new Junk() { Name = "BANANAS!!", Item

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

    protected override void Seed(JunkContext context)
    {
        context.Junks.AddOrUpdate(x => x.Name,
            new Junk()
            {
                Name = "BANANAS!!",
                Item = new JunkItem()
                {
                    Name = "APPLES!!!"
                }
            }
        );
    }
在PMC中运行更新数据库时,所有实体都会成功创建。好。
但是,当您希望去更新数据库时,可以说您的种子方法是:

    protected override void Seed(JunkContext context)
    {
        context.Junks.AddOrUpdate(x => x.Name,
            new Junk()
            {
                Name = "BANANAS!!",
                Item = new JunkItem()
                {
                    Name = "ORANGES!!!"
                }
            }
        );
    }
子实体未更新。看来我们能重新设定种子的唯一方法就是删除数据库并重新设定种子。我想我理解为什么这个方法不能像我期望的那样工作,但是也许有人可以给我指出正确的方向,相应地更新这个种子方法。我知道我可以把上下文写下来。(…)但这似乎超过了“AddOrUpdate”的全部目的


我想我必须为每个子实体定义“键”。示例:“Junk”获取x=>x.Name,但“JunkItem”当前必须设置“updatekey”。我假设这就是问题所在,但我该如何处理呢?

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


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

谢谢您的输入。我只是试图避免为所有这些孩子创建一个新的变量。我创建了一个名为'AddOrUpdateChild'的扩展方法,它只调用'AddOrUpdate',然后返回给定的T的实例。通过这种方式,您可以手动“添加或更新”子实例,并在线设置外键。到目前为止,在初始测试中,它被证明是成功的。当您调用AddOrUpdate时,如何返回T的实例?它是否返回插入项目的Id?你能分享吗?事实上,当你添加或更新时,你根本不需要返回t的实例。EF是非常OOP的,上下文强制执行引用完整性。这意味着,如果在操作后添加或更新将为其分配FK或PK的对象,则内存中保留的对象将自动更新为具有这些分配的属性。自己试试:将数据库生成的PK放在模型上,然后通过EF插入模型。然后,在不重新查询数据库的情况下,检查模型上的PK。它应该更新以显示其新分配的主键。