2016-08-13 3 views
0

仮にに戻って書いていない:LINQのエントリ(entity.Related).Query.Load()私は3つのEFのエンティティクラスを持っているコレクションプロパティ

 
public class Person { 
    ... 
    public ICollection Vehicles { get; set; } 
} 

public class Vehicle { 
    ... 
    public Person Owner { get; set; } 

    public CarModel ModelInfo { get; set; } 
} 

public class CarModel { 
    ... 
    // properties for make, model, color, etc 
} 

Person.Vehiclesプロパティは、レイジーロードされています。

Personインスタンスが既にロードされていて、そのプロパティも含まれるようにVehicleコレクションプロパティをロードしたいとします。

だから私はこのていますので、同じように使用

void LoadVehiclesAndRelated(MyDbContext dbContext, Person person) 
{ 
    dbContext.Entry(person) 
     .Collection(p => p.Vehicles) 
     .Query() 
     .Include(v => v.ModelInfo) 
     .Load(); 
} 

:私はこれを行うとき、それは最初p.Vehicles式を評価するときの特性があるため、

using(MyDbContext dbContext = ...) { 

    Person p = GetPerson(123); 

    LoadVehiclesAndRelated(dbContext, p); 
} 

foreach(Vehicle v in p.Vehicles) { 
    Console.WriteLine(v.ModelInfo); 
} 

は、しかし、私は、実行時に例外を取得実際には空です(したがって、ロードしたい)が、DbContextが破棄されるようになりました。

.Load()呼び出しが行われた(LoadVehiclesAndRelated()の内側に、私はSQLはSQL Serverプロファイラでサーバー()に対​​して実行されているが、コレクションプロパティが空のままで見ました。

どのように私は、プロパティを読み込むことができますし、IncludeとDサブプロパティ

うるさく、このシナリオは、明示的なローディングのためのMSDNガイドで言及されていない?https://msdn.microsoft.com/en-us/data/jj574232.aspx

+1

ただ明確にするため、 'LoadVehiclesAndRelated'内部' dbContext'変数は、(MyDbContextコンテキストを使用して=囲ん '...'と同じである –

+0

@IvanStoevはい - ?私は私の質問に明確化を追加します – Dai

答えて

1

.Query().Load()を呼び出すように見えるが悲惨なDbCollectionEntry.Loadの呼び出しと同じではありません重要な違いは、前者ではIsLoadedプロパティが設定されていないため、後で遅延ロードがトリガーされることです。おそらく、リンクで説明されているように、前者はフィルタリングされた(部分的な)収集負荷シナリオに使用されることを意図しているからです。

var entry = dbContext.Entry(person); 
var vehicleCollection = entry.Collection(p => p.Vehicles); 
vehicleCollection.Query() 
    .Include(v => v.ModelInfo) 
    .Load(); 
vehicleCollection.IsLoaded = true; 

P.S.:

まもなく、問題を解決するために、単にコレクションをロードした後にtrueにIsLoadedを設定それがために遅延読み込みをオフにすることが最善であるQueryメソッドを使用している場合

:明示的セクションを関連するエンティティをロードするときに正確を期すために、この動作は一種の適用するフィルタの最後で言及されていますナビゲーションプロパティ。これは、フィルタリングされたクエリが実行される前または後に、レイジーローディングメカニズムによってコレクション全体が自動的にロードされる可能性があるためです。

関連する問題