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 に答える