C# 如何将实体映射到包含层次结构的维度表?
考虑以下层次结构:C# 如何将实体映射到包含层次结构的维度表?,c#,entity-framework,entity-framework-4.1,data-warehouse,dimensional-modeling,C#,Entity Framework,Entity Framework 4.1,Data Warehouse,Dimensional Modeling,考虑以下层次结构: Department -> Category -> Product (每个部门包含多个类别,每个类别包含多个产品。) 使用方法,我创建了一个ProductDim表,其中包含以下列: ProductKey Product Category Department 我正在尝试使用EF4.1将我的部门、类别和产品实体映射到ProductDim表。以下是相关类别的简化版本: public class Department { public string Name
Department -> Category -> Product
(每个部门包含多个类别,每个类别包含多个产品。)
使用方法,我创建了一个ProductDim表,其中包含以下列:
ProductKey
Product
Category
Department
我正在尝试使用EF4.1将我的部门
、类别
和产品
实体映射到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");
}
}
公共课部
{
公共字符串名称{get;set;}
}
公共类类别
{
公共字符串名称{get;set;}
}
公共类产品
{
公共字符串名称{get;set;}
}
公共类MyContext:DbContext
{
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity().ToTable(“ProductDim”);
modelBuilder.Entity().HasKey(t=>t.Name);
modelBuilder.Entity().Property(t=>t.Name).HasColumnName(“部门”);
modelBuilder.Entity().ToTable(“ProductDim”);
modelBuilder.Entity().HasKey(t=>t.Name);
modelBuilder.Entity().Property(t=>t.Name).HasColumnName(“类别”);
modelBuilder.Entity().ToTable(“ProductDim”);
modelBuilder.Entity().HasKey(t=>t.Name);
modelBuilder.Entity().Property(t=>t.Name).HasColumnName(“产品”);
}
}
问题是,当我尝试使用这些类时,会出现以下异常:
System.InvalidOperationException:异常
实体类型“类别”和
“部门”无法共享表
“ProductDim”,因为它们不在
相同类型层次结构或没有
有效的一对一外键
与匹配主节点的关系
他们之间的钥匙
有什么解决办法吗?如果没有,实体框架能否成功地用于按维度建模的数据库?您的代码似乎有些不对劲。 您应该像下面的示例一样创建产品类
public class Department
{
public string Name { get; set; }
public List<Category> Categories { get; set; }
}
公共课部
{
公共字符串名称{get;set;}
公共列表类别{get;set;}
}
你们的分类课应该是这样的
public class Category
{
public string Name { get; set; }
public List<Product> Products { get; set; }
}
公共类类别
{
公共字符串名称{get;set;}
公共列表产品{get;set;}
}
这遵循了部门的逻辑,部门有很多类别,有很多产品。实体框架只能与正确建模和规范化的关系(OLTP)数据库一起工作。数据仓库用于商业智能(OLAP)工具,而不是ORM映射。您将无法将表映射到实体-实体框架无法做到这一点 正如错误所说,只有在以下情况下,EF才允许将多个实体映射到同一个表:
- 您使用的是每类型表继承(这意味着您的实体必须位于继承层次结构中)。您的实体显然不是同一继承结构的一部分
- 您正在使用表拆分,其中一个表拆分为多个以一对一关系相关的实体