[英]StarSchema - Entity Framework Core - Migration
我正在嘗試使用代碼優先方法(星型模式)構建數據倉庫(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"));
}
}
使用遷移后,架構如下所示:
當您指定屬性[ForeignKey("DimTest1")]
時,您是在告訴 EF 使用DimTest1
作為FactBase
class 的導航屬性,而不是指向DimTest1
class。
但由於該屬性不存在,因此它不會創建關系。
將您的 class 更改為:
[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
}
這應該使它按預期工作。
正如您所暗示的那樣,星型模式事實表應該使用由它引用的外鍵組成的復合鍵。 所以我想說你的情況有幾個問題需要解決。 首先,事實表可能不應該有一個名為 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 class 的 Id 字段中刪除 [Key] 屬性。
參考: https://docs.microsoft.com/en-us/ef/core/modeling/keys?tabs=data-annotations
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.