Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将实体映射到包含层次结构的维度表?_C#_Entity Framework_Entity Framework 4.1_Data Warehouse_Dimensional Modeling - Fatal编程技术网

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才允许将多个实体映射到同一个表:

  • 您使用的是每类型表继承(这意味着您的实体必须位于继承层次结构中)。您的实体显然不是同一继承结构的一部分
  • 您正在使用表拆分,其中一个表拆分为多个以一对一关系相关的实体

您使用的是代码优先方法吗?@Jethro-是的,我使用的是代码优先方法。这是下一步-一旦我将实体映射到表中。在您的示例中,如何将部门和类别映射到ProductDim表?