【问题标题】:How to map entities to dimension table which includes a hierarchy?如何将实体映射到包含层次结构的维度表?
【发布时间】:2011-07-05 17:45:44
【问题描述】:

考虑以下层次结构:

Department -> Category -> Product

(每个部门包含多个类别,每个类别包含多个产品。)

dimensional modeling 使用Kimball 方法,我创建了一个包含以下列的ProductDim 表:

ProductKey
Product
Category
Department

我正在尝试使用 EF 4.1 将我的 DepartmentCategoryProduct 实体映射到 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: 实体类型“类别”和 “部门”不能共享表 'ProductDim' 因为它们不在 相同类型的层次结构或没有 有效的一对一外键 与匹配的主要关系 它们之间的键。

有什么解决方法吗?如果不能,Entity Framework 能否成功地与维度建模的数据库一起使用?

【问题讨论】:

  • 您是否使用代码优先方法?
  • @Jethro - 是的,我使用的是代码优先方法。

标签: c# entity-framework entity-framework-4.1 data-warehouse dimensional-modeling


【解决方案1】:

实体框架只能与正确建模和规范化的关系 (OLTP) 数据库一起使用。数据仓库适用于商业智能 (OLAP) 工具,而不适用于 ORM 映射。您不会将表映射到您的实体 - 实体框架无法做到这一点。

正如错误所说,只有在以下情况下,EF 才允许将多个实体映射到同一个表:

  • 您正在使用按类型继承的表(这意味着您的实体必须位于继承层次结构中)。您的实体显然不属于同一继承结构。
  • 您正在使用表拆分,其中一个表拆分为多个以一对一关系关联的实体。

【讨论】:

    【解决方案2】:

    您的代码似乎有些不对劲。 您应该像下面的示例一样创建您的 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; }
    }
    

    这遵循你的逻辑部门有很多类别,其中有很多产品。

    【讨论】:

    • 这是下一步 - 一旦我将实体映射到表格。在您的示例中,如何将 Department 和 Category 映射到 ProductDim 表?
    猜你喜欢
    • 2012-05-23
    • 2017-10-17
    • 2010-09-26
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    相关资源
    最近更新 更多