0

Linq to Entitiesで、重複したグラフが生成されることがあるという奇妙な問題があります。インクルードを使用して、要求されたグラフのベースに単純な制限があるクエリは、重複を生成しません。

同じクエリがグラフの他の場所で別の制限付きで使用されている場合、重複があります。

次のグラフを検討してください。

Entity1
  Entity2
    Entity3
      Entity4
         Entity5
           Entity6
      Entity7
      Entity8

さて、このクエリ:

var query = context.Entity1.Where(u => (u.StringProp.StartsWith(someValue)));
query = query.Include(@"NavpropEntity2.NavPropEntity3.NavPropEntity4.NavPropEntity5.NavEntity6");
query = query.Include(@"NavpropEntity2.NavPropEntity3.NavPropEntity7");
query = query.Include(@"NavpropEntity2.NavPropEntity3.NavPropEntity8");

グラフのentity6の重複は生成されません。

しかし、次のクエリはそうです!

query = context.Entity1.Join(context.Entity3, u => u.Entity2.Entity3.Entity4Id, g => g.Id, (u, g) => new NotSoAnonymousTypeWithParameterLessConstructor { Entity4= g, Entity1 = u })
                                .Where(
                                    ApplyNotSoAnonymousTypeRestrictions(
                                    StringProp,
                                    Id)
                                ).Select(z => z.Entity1);
    query = query.Include(@"Navprop1.NavProp2.NavProp3.NavProp4.NavProp5");
    query = query.Include(@"Navprop1.NavProp2.NavProp3.NavProp6");
    query = query.Include(@"Navprop1.NavProp2.NavProp3.NavProp7");

Entity6の複製を生成します。

エンティティグラフには、linqクエリの最後に問題があることに注意してください。したがって、これはEF / STEの問題であり、STEの問題ではありません。

これは、このブログ投稿で説明されているように、変更を永続化するためにグラフがサーバーに返送されるときに発行されます。

誰かが同じ問題に遭遇し、解決策を見つけたことを願っています。TIA。

4

1 に答える 1

0

この問題は、EF5で導入されたAsNoTracking()拡張機能を使用するときに発生します。これはクエリ構造とは何の関係もありません。私のデータアクセスコードはテンプレート(.tt)から生成されていますが、今日同じ問題が発生し、重複を返さなかった1つのメソッドと重複を返した別のメソッドを比較することができました。唯一の違いはそれでした。

于 2013-01-16T13:44:31.093 に答える