考虑以下层次结构:
Department -> Category -> Product
(每个部门包含多个类别,每个类别包含多个产品 . )
使用Kimball方法dimensional modeling,我创建了一个包含以下列的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是否可以成功用于维度建模的数据库?
2 回答
实体框架只能与正确建模和规范化的关系(OLTP)数据库一起使用 . 数据仓库适用于商业智能(OLAP)工具,不适用于ORM映射 . 您不会将表映射到您的实体 - 实体框架无法执行此操作 .
因为错误说EF只允许在以下情况下将多个实体映射到同一个表:
您正在使用Table每类型继承(这意味着您的实体必须位于继承层次结构中) . 您的实体显然不属于同一继承结构 .
您正在使用表拆分,其中一个表被拆分为多个以一对一关系相关的实体 .
关于你代码的事情似乎并不合适 . 您应该像下面的示例一样创建Product类 .
你的Category类看起来应该是这样的 .
这跟你的部门逻辑有很多类别,其中有很多产品 .