1

デバッガーの下で、のエントリを返すケースがありDbContext.ChangeTracker.Entry(e)ます。の検索結果と基になるエントリを列挙すると、(期待される)のエントリが見つかります。StateDetachedDbContext.ChangeTracker.Entries()ObjectContexteStateUnchanged

何が起こっている?

追加の詳細は次のとおりです。

  • POCO エンティティを使用します。
  • 変更追跡はオンです
  • プロキシの作成はオフです
  • 遅延読み込みはオフです
  • エンティティを初めて保存するとき (コンテキストへの追加など) には問題は発生しません。古いエンティティをコンテキストに取得してから変更しようとすると発生します。これは、変更されるべきではない多くの「参照」エンティティを含む集約ルートです
  • Equalsエンティティでオーバーライドされ、IEquatable<T>実装されます。そのコードは T4 によって生成されます。
  • 私は、保存のためのルールを生成するように宣言的に構成された汎用リポジトリ実装を使用しています (たとえば、エンティティを追加、添付/変更、添付/未変更する必要があるかどうか。正しい順序でこれを行っているようです。たとえば、集約ルートが追加されます/attached を最後にアタッチすると、最初に他のエンティティが変更された状態で取り込まれるためです (変更されていないエンティティを最初に追加すると、これが防止されます)。
4

1 に答える 1

0

(質問の編集で回答。コミュニティ wiki の回答に変換。回答がない質問を参照してください。ただし、コメントで問題が解決されました (またはチャットで拡張) )

OP は次のように書いています。

私は問題を「解決」しましたが、何が起こっているのかを知りたいと思っています。なぜなら、私の解決策は根本的な原因に対処するために何もしていないからです. 私の「解決策」は、変更トラッカーでエンティティを探します (私はまた、このコードを使用してそれを実行するcontext.Entry()context.Set().Local(ブレークポイントを設定できるように、LINQ ではなくループとして実行しました)、それは機能します:

private DbEntityEntry GetChangeTrackedEntry(IEntity mine, Type type)
    {
        foreach (var en in context.ChangeTracker.Entries())
        {
            if (en.Entity.GetType() != type)
                continue;
            if (((IEntity)en.Entity).Id != mine.Id)
                continue;
            return en;
        }

        return null;
    }

私のエンティティを直接使用して(変更トラッカー、セットなどを介して)エンティティを検索しようとすると、ケースが切り離されてしまいます。

おそらくEFを使用するケースがあると思いましたReferenceEqualsが、@LadislavのコメントはEquals実装に問題があることを示している可能性があります。

誰かがさらに説明を持っている場合は、それをこのコミュニティ wiki の回答に編集できます。

于 2015-02-03T16:21:02.040 に答える