2

次の階層を検討してください。

Department -> Category -> Product

(各部門には複数のカテゴリがあり、それぞれに複数の製品が含まれています。)

次元モデリングへのKimballアプローチを使用して、次の列を持つ ProductDim テーブルを作成しました。

ProductKey
Product
Category
Department

DepartmentEF 4.1 を使用して、、、CategoryおよびProductエンティティを ProductDim テーブルにマップしようとしています。関連するクラスの簡略版を次に示します。

public class Department
{
    public string Name { get; set; }
}

public class Category
{
    public string Name { get; set; }
}

public class Product
{
    public string Name { get; set; }
}

public class MyContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Department>().ToTable("ProductDim");
        modelBuilder.Entity<Department>().HasKey(t => t.Name);
        modelBuilder.Entity<Department>().Property(t => t.Name).HasColumnName("Department");

        modelBuilder.Entity<Category>().ToTable("ProductDim");
        modelBuilder.Entity<Category>().HasKey(t => t.Name);
        modelBuilder.Entity<Category>().Property(t => t.Name).HasColumnName("Category");

        modelBuilder.Entity<Product>().ToTable("ProductDim");
        modelBuilder.Entity<Product>().HasKey(t => t.Name);
        modelBuilder.Entity<Product>().Property(t => t.Name).HasColumnName("Product");
    }
}

問題は、これらのクラスを使用しようとすると、次の例外が発生することです。

System.InvalidOperationException : エンティティ タイプ 'Category' と 'Department' はテーブル 'ProductDim' を共有できません。これらは同じタイプ階層にないか、それらの間で主キーが一致する有効な 1 対 1 の外部キー関係がないためです。

これに対する回避策はありますか? そうでない場合、Entity Framework は次元的にモデル化されたデータベースでうまく使用できますか?

4

2 に答える 2

3

エンティティ フレームワークは、正しくモデル化され正規化されたリレーショナル (OLTP) データベースでのみ機能します。データ ウェアハウジングは、ORM マッピングではなく、ビジネス インテリジェンス (OLAP) ツール用です。テーブルをエンティティにマップしません-エンティティフレームワークはそれを行うことができません。

エラーによると、EF は次の場合にのみ複数のエンティティを同じテーブルにマッピングできます。

  • タイプごとの継承を使用しています(つまり、エンティティは継承階層にある必要があります)。あなたのエンティティは明らかに同じ継承構造の一部ではありません。
  • 1 つのテーブルが 1 対 1 の関係で関連する複数のエンティティに分割されるテーブル分割を使用しています。
于 2011-07-05T21:53:51.183 に答える
0

コードに関する何かが正しくないようです。以下の例のような Product クラスを作成する必要があります。

public class Department
{
    public string Name { get; set; }
    public List<Category> Categories { get; set; }
}

Category クラスは次のようになります。

public class Category
{
    public string Name { get; set; }
    public List<Product> Products { get; set; }
}

これは、部門が多くの製品を持つ多くのカテゴリを持つというロジックに従います。

于 2011-07-05T18:05:15.787 に答える