如何将实体映射到包含层次结构的维度表?
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 将我的 Department
、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: 实体类型“类别”和 “部门”不能共享表 '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 表?以上是关于如何将实体映射到包含层次结构的维度表?的主要内容,如果未能解决你的问题,请参考以下文章