【问题标题】:StarSchema - Entity Framework Core - MigrationStarSchema - 实体框架核心 - 迁移
【发布时间】:2021-06-27 10:07:45
【问题描述】:

我正在尝试使用代码优先方法(星型模式)构建数据仓库 (DWH):

事实/维度类:

    [Table("FactBase")]
    public class FactBase
    {
        [Key]
        public Guid Id { get; set; }

        [ForeignKey("DimTest1")]
        public string DimDigitalesBuchISBN { get; set; }

        public virtual DimTest1 DimTest1 { get; set; }  
    }


    [Table("DimTest1")]
    public class DimTest1
    {
        [Key]
        public string ISBN { get; set; }

        public string Bla { get; set; }
    }

上下文:

public class XDBContextDWH : DbContext
{      
    public DbSet<FactBase> FactBase { get; set; }
    public DbSet<DimTest1> DimTest1 { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(new string("connection string"));
    }
}   

使用迁移后,架构如下所示:

基于那个star schema,不应该是这样的关系(这里:SQL)吗?

【问题讨论】:

  • 更新了我的帖子,感谢@Ortiga
  • 为什么要在 EF 中构建 OLAP 架构?星型模式不适用于 OLTP 源。相反,您应该将 3NF(+) 用于应用程序数据存储。

标签: c# entity-framework-core entity-relationship data-warehouse star-schema


【解决方案1】:

当您指定属性[ForeignKey("DimTest1")] 时,您是在告诉EF 使用DimTest1 作为FactBase 类的导航属性,而不是指向DimTest1 类。

但由于该属性不存在,因此它不会创建关系。

将您的班级更改为:

[Table("FactBase")]
public class FactBase
{
    [Key]
    public Guid Id { get; set; }

    [ForeignKey("DimTest1")]
    public string DimDigitalesBuchISBN { get; set; }
    public virtual DimTest1 DimTest1 { get; set; } // navigation property
}

这应该使它按预期工作。

【讨论】:

    【解决方案2】:

    正如您所暗示的那样,星型架构事实表应该使用由它所引用的外键组成的复合键。 所以我想说你的情况有几个问题需要解决。 首先,事实表可能不应该有一个名为 Id 的列,尽管它不会真正伤害任何东西,它可能永远不会用于查询,因此您只是添加了占用磁盘空间的额外数据。 其次,您可能正在寻找的答案是,如果您想要事实表上的复合主键,您需要在数据库上下文中指定它。

    
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<FactBase>()
            .HasKey(x => new { x.Id, x.DimDigitalesBuchISBN });
    }
    
    

    正如我所提到的,您可能不想在您的 PK 中包含 Fact.Id 列,而是您会像这样引用多个维度:

    
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<FactBase>()
            .HasKey(x => new { x.Dim1Id, x.Dim2Id, x.Dim3Id});
    }
    
    

    其中 Dim1Id、Dim2Id 和 Dim3Id 是维度的主键。 我还应该提到,您需要从 FactBase 类的 Id 字段中删除 [Key] 属性。

    参考:https://docs.microsoft.com/en-us/ef/core/modeling/keys?tabs=data-annotations

    【讨论】:

      猜你喜欢
      • 2020-06-21
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 2019-11-08
      • 2022-01-28
      • 2019-02-25
      • 2018-12-05
      相关资源
      最近更新 更多