2017-05-23 9 views
0

配送料を問い合わせており、その1つ(品目タイプ)の物品を含めて、配送料のリストを持っていることを除いてすべてが返ってきています。それゆえ返送の配達兄弟。ここでEFは子の参照を親の兄弟に戻します

は私のクラスです:

public class Delivery 
{ 
    public int DeliveryId { get; set; } 
    public DateTime DeliveryDate { get; set; } 
    ... 
    public int MaterialTypeId { get; set; } 
    public virtual MaterialType MaterialType { get; set; } 
} 

public class MaterialType 
{ 
    public int MaterialTypeId { get; set; } 
    public string Name { get; set; } 
    ... 
    public virtual ICollection<Delivery> Deliveries { get; set; } 
} 

ここでここで日付範囲によって私の配達クエリ

var deliveries = DataStore.Filter<Delivery>(i => 
       i.DeliveryDate >= startDate && i.DeliveryDate < endDate 
       ,new string[] { "MaterialType" }) // Includes 
       .OrderByDescending(i => i.DeliveryDate).ToList(); 

public virtual IQueryable<T> Filter<T>(Expression<Func<T, bool>> predicate, string[] includes = null) where T : class 
{ 
    IQueryable<T> set = dbContext.Set<T>(); 
    if (includes != null && includes.Count() > 0) 
    { 
     foreach (var include in includes) 
     { 
      set = set.Include(include); 
     } 
    } 
    return set.Where<T>(predicate).AsQueryable<T>(); 
} 

は、私は戻って、クエリとDelivery.MaterialTypeから取得していた結果ですされています。配達は元の配達の兄弟と戻って住んでいる。

[{ 
    "DeliveryId": 1, 
    "DeliveryDate": "2017-05-22", 
    "MaterialTypeId": 2, 
    "MaterialType": { 
     "MaterialTypeId": 2, 
     "Name": "Bulk", 
     "Deliveries": [{ 
      "DeliveryId": 2, 
      "DeliveryDate": "2017-05-22", 
      "MaterialTypeId": 2, 
     }, 
     { 
      "DeliveryId": 3, 
      "DeliveryDate": "2017-05-22", 
      "MaterialTypeId": 2, 
     }] 
    } 
}] 

レイジーロードが無効に設定されています。

dbContext.Configuration.LazyLoadingEnabled = false; 

どのような方法でMaterialTypesが配送を設定しないようにする方法はありますか?

+0

これは、(兄弟を含めてはいけませんが)熱心な読み込み( 'Include')の仕組みです。あなたのケースでは、* lazy loading *(これは私が見ているように 'virtual'です)によってコレクションにデータが格納されている可能性があります。 –

+0

@IvanStoev私が気づいたのは、MaterialTypeでの配信は、上記のフィルタ(Date range)に基づいているということです。 – Miguel

答えて

2

私はむしろ、これは関係の自動配線を上にして何かをする必要がある場合があります、レイジーローディングがここに障害があるか分かりません。

だから、A型の配送AとB型の配送Bがあるとします。出荷伝票に対してクエリを発行して品目タイプを含めると、品目タイプAの出荷伝票のリストには、出荷伝票Aと出荷伝Bが含まれます。なぜなら、それらが問合せの結果としてコンテキストにロードされるからです。

遅延読み込みを無効にすると、プロパティにアクセスするときにエンティティを読み込まないようにEFに指示しますが、すでにコンテキスト内にあるエンティティ間の関係を修正することについては何も言いません。

同じDbContextオブジェクトを使用して複数のクエリを発行すると、同じ状況が発生する可能性があります。クエリが実行され、結果がマテリアライズされると、オブジェクトはコンテキスト内にあります。したがって、結果のオブジェクトの1つが以前に読み込まれたエンティティへの参照を持つ同じコンテキストで別のクエリを発行した場合、ナビゲーションプロパティはコンテキストにあるオブジェクトに基づいて自動的に設定されます。

+0

これらのプロパティを避けるためにできることはありますか?私はアイテムを繰り返し、値をクリアしている解決策があります。 – Miguel

+0

素晴らしい提案!私はエンティティ関係のフィックスアップを完全に忘れていました。 –

+1

@Miguel正直言ってわかりません。 'AsNoTracking()'メソッド呼び出しをクエリに追加することもできますが、これは複数のクエリから問題が発生した場合にのみ機能します。修正されたエンティティが1つのクエリの結果として実現された場合、それがうまくいくかどうかはわかりません(問題を解決するかどうかは正直に分かりません)。また、コンテキストの 'AutoDetectChangesEnabled'プロパティをfalseに設定してみることもできますが、実際に問題を解決するかどうかは確かではありません(コンテキストに新しいエンティティを追加する場合は間違いありません)。 –

0

シリアル化しているオブジェクトにレイジーローディングが有効になっているため、すべてのプロパティが設定されています。お問い合わせの前に、このような遅延読み込みを無効にします。

DataStore.Configuration.LazyLoadingEnabled = false; 
+0

お返事ありがとうございます!私はすでに遅延読み込みプロパティをfalseに設定しています。そのビットの情報で私の質問を更新しました。 – Miguel

+0

レイジーローディングが無効になっていると主張しているべきではありません。一部のデバッグコードを投げて、実際に無効になっていることを確認し、DataStoreがレイジーロードを無効にした同じdbContextを使用していることを確認します。モデルから 'virtual'キーワードを削除することもできます。これは、遅延ロードを望まないことをEFに通知する必要があります。 –

+0

遅延ロードがfalseに設定されていることを確認しました。また、仮想キーワードを削除しても、同じ問題が発生しました。 – Miguel

関連する問題