レガシ データベースで Entity Framework Code First (5.0) を使用しようとしていますが、結合テーブルを含む一般的なパターンに問題があります。
たとえば、Customer は複数の Addresses を持つことができますが、Address テーブルは他のタイプの住所にも使用されるため、Customer -> CustomerAddress -> Address というように、顧客とその住所をリンクする結合テーブルがあります。結合テーブル CustomerAdress には、customer-Id と address-Id があります。
このモデルでは、Customer クラスと Address クラスのみがあり、次のように簡略化されています。
public class Customer
{
public long Id { get; set; }
public IList<Address> Addresses { get; set; }
}
public class Address
{
public long Id { get; set; }
}
次のようなコードを使用して、OnModelCreating でマッピングを設定します。
modelBuilder.Entity<Customer>()
.HasMany(o => o.Addresses)
.WithMany()
.Map(m =>
{
m.ToTable("CustomerAddress");
m.MapLeftKey("CustomerId");
m.MapRightKey("AddressId");
});
すべて正常に動作しますが、Include() Addresses という Customer に対してクエリを実行しようとすると、結果の SQL は複数の結合を持つ選択からの選択で非常に複雑に見え、このような別のリレーションを追加した後、SQL の種類が爆発的に増加します。
この関係の SQL を手作業でコーディングする場合、Customer から CustomerAddress への左外部結合を使用してから、CustomerAddress から Address への結合を使用します。この例で Entity Framework にもっと単純な sql-statement を作成させる方法はありますか?