2

考虑以下层次结构:

Department -> Category -> Product

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

使用Kimball方法进行维度建模,我创建了一个 ProductDim 表,其中包含以下列:

ProductKey
Product
Category
Department

我正在尝试使用 EF 4.1 将我DepartmentCategory、 和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”,因为它们不在同一类型层次结构中,或者它们之间没有有效的一对一外键关系和匹配的主键。

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

4

2 回答 2

3

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

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

  • 您正在使用按类型继承的表(这意味着您的实体必须在继承层次结构中)。您的实体显然不是同一继承结构的一部分。
  • 您正在使用表拆分,其中一个表被拆分为以一对一关系关联的多个实体。
于 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 回答