2

レガシ データベースで 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 を作成させる方法はありますか?

4

0 に答える 0