【问题标题】:EF AddOrUpdate Seed does not Update Child EntitiesEF AddOrUpdate 种子不更新子实体
【发布时间】:2012-08-13 21:07:19
【问题描述】:

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

    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 但“垃圾项目”当前必须设置“更新密钥”。我假设这是问题所在,但我将如何处理呢?

【问题讨论】:

    标签: c# entity-framework entity-framework-migrations


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的意见。我只是想避免为所有这些孩子创建一个新变量。我创建了一个名为“AddOrUpdateChild”的扩展方法,它只调用“AddOrUpdate”,然后返回给定的 T 实例。这样,您可以手动“添加或更新”您的子实例并将外键全部设置为内联。到目前为止,在初步测试中,它被证明是成功的。
    • 当你调用 AddOrUpdate 那么你如何返回 T 的实例?它是否返回插入项目的 ID?可以分享一下吗?
    • 实际上,添加或更新时根本不必返回 T 的实例。 EF 是非常面向对象的,并且上下文强制引用完整性。这意味着,如果您 AddOrUpdate 一个在操作后将分配 FK 或 PK 的对象,则您在内存中持有的对象将自动更新为具有这些分配的属性。自己试试:把一个数据库生成的PK放到一个模型上,然后通过EF插入模型。然后,在不重新查询数据库的情况下,检查模型上的 PK。应该更新它以显示它是新分配的 PK。
    猜你喜欢
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 2013-03-03
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多