N層アプリケーションでWCFと組み合わせてEF5コードファーストを使用しています。
クライアントとサーバーの間で関連エンティティを非同期的かつ段階的にロードしています。すべてがうまく機能していますが、いくつかの最適化を行いたいと思います。
Car
関連エンティティを持つ架空のエンティティを考えてみましょうWheel
:
public class Car
{
public int Id { get; set; }
public virtual List<Wheel> Wheels { get; set; }
}
public class Wheel
{
public int Id { get; set; }
public virtual int CarId { get; set; }
}
および関連する DTO:
public class CarDTO
{
public int Id { get; set; }
public virtual int CarId { get; set; }
public virtual List<int> Wheels { get; set; }
}
Wheels
DTO の外部キーのリストであることに注意してください。必ずしもすべてのオブジェクトを Web サービス経由で転送する必要はありません。必要に応じWheel
て、クライアントは後の WCF 呼び出しでオブジェクトを読み込みます。現在、AutoMapper を使用して、関連するエンティティを FK のリストにフラット化しています。
DbContext
これに関する問題は、オブジェクトを取得するときに、Web サービスが常に Wheel オブジェクト全体をロードする必要があるとは限らないCar
ことです。いずれにせよ、Web サービス経由でそれらを送信することはありません (後で要求されない限り)。しかし、クエリはホイール オブジェクト全体をデータベースから Web サービス呼び出しにロードしますが、破棄されるだけです。Wheels
あたり100 の場合Car
、Web サービスとデータベースの間を流れる大量の不要なデータです。
私がやりたいことはCar
、次のようなものに変更することです:
public class Car
{
public int Id { get; set; }
public virtual List<Wheel> Wheels { get; set; } // Normally empty
public virtual List<int> WheelIDs { get; set; } // Normally full
}
そのため、Web サービスがすべての をロードする必要があることを認識した場合、クエリにWheels
追加することでロードできますが、通常は、後で取得できる.Include(car => car.Wheel)
FK のリストを返すだけです。WheelIDs
EF5 はこれを簡単に実行できますか? もしそうなら、どのように?