0

Entity Framework を使用して DbContext オブジェクトから生成された SQL で、重複した結合が多数発生しています。これが私の基本的な構造です

CatalogTable( CatalogID int 主キー )

CategoryTable( CategoryID int PRIMARY KEY, CatalogID int NOT NULL )

DepartmentTable( DepartmentID int PRIMARY KEY, CatalogID int NOT NULL)

製品( CatalogID int NOT NULL, CategoryID int NOT NULL, DepartmentID int NOT NULL )

簡単に言えば、製品にはカタログ、カテゴリ、部門が必要です。これを反映するように、すべてのナビゲーション プロパティを設定しました。はい、「製品」は、カテゴリまたは部門を通じて間接的にカタログに関連付けることができます。しかし、2 つの可能なパスがあるため、製品がカタログに属していることを明示的に示すことにしました。

したがって、問題は、EFがこれらの必要な関係に参加し続け、基本的にカテゴリと部門の二重結合を吐き出すことになります。

モデル:

           //catalogs
            modelBuilder.Entity<Catalog>().ToTable("Catalog.Catalogs");
            modelBuilder.Entity<Catalog>().HasKey(k => k.CatalogID);

            //products
            modelBuilder.Entity<CatalogItem>().ToTable("Catalog.Products");
            modelBuilder.Entity<CatalogItem>().HasKey(k => k.ProductID);
            modelBuilder.Entity<CatalogItem>().HasRequired(req => req.CatalogCategory).WithMany().Map(m => m.MapKey("CatalogCategoryID"));
            modelBuilder.Entity<CatalogItem>().HasRequired(req => req.CatalogDepartment).WithMany().Map(m => m.MapKey("CatalogDepartmentID"));
            modelBuilder.Entity<CatalogItem>().HasRequired(req => req.Catalog).WithMany().Map(m => m.MapKey("CatalogID"));

            //departments
            modelBuilder.Entity<CatalogDepartment>().ToTable("Catalog.Departments");
            modelBuilder.Entity<CatalogDepartment>().HasKey(k => k.CatalogDepartmentID);
            modelBuilder.Entity<CatalogDepartment>().HasRequired(req => req.Catalog).WithMany().Map(m => m.MapKey("CatalogID"));

            //categories
            modelBuilder.Entity<CatalogCategory>().ToTable("Catalog.Categories");
            modelBuilder.Entity<CatalogCategory>().HasKey(k => k.CatalogCategoryID);
            modelBuilder.Entity<CatalogCategory>().HasRequired(req => req.Catalog).WithMany().Map(m => m.MapKey("CatalogID"));

リンク:

var query = Products
    .Include(inc=>inc.CatalogCategory)
    .Include(inc=>inc.CatalogDepartment)
    .Include(inc=>inc.Catalog);



query.ToList();

生成された SQL:

SELECT *
FROM     [Catalog].[Products] AS [Extent1]
INNER JOIN [Catalog].[Categories] AS [Extent2] ON [Extent1].[CatalogCategoryID] = [Extent2].[CatalogCategoryID]
LEFT OUTER JOIN [Catalog].[Categories] AS [Extent3] ON [Extent1].[CatalogCategoryID] = [Extent3].[CatalogCategoryID]
LEFT OUTER JOIN [Catalog].[Departments] AS [Extent4] ON [Extent1].[CatalogDepartmentID] = [Extent4].[CatalogDepartmentID]
LEFT OUTER JOIN [Catalog].[Catalogs] AS [Extent5] ON [Extent1].[CatalogID] = [Extent5].[CatalogID]

「カテゴリ」が 2 回結合されていることがはっきりとわかります。1 回は内部結合として、もう 1 回は外部結合として。

リレーションシップをきれいに (そして正確に) 確立するが、重複バインディングを防ぐ方法はありますか? ありがとう!

4

0 に答える 0