如何将实体映射到包含层次结构的维度表?

Posted

技术标签:

【中文标题】如何将实体映射到包含层次结构的维度表?【英文标题】: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 - 是的,我使用的是代码优先方法。 【参考方案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 表?

以上是关于如何将实体映射到包含层次结构的维度表?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 mdx 中的另一个维度层次结构过滤维度层次结构

慢慢改变尺寸

什么是处理维度表中层次结构的好方法

将维度链接到事实表的表是事实的维度吗?

如何定义维度在 ssas 中使用的连接

SSAS - 如何处理具有有效重复项的维度?