簡體   English   中英

Entity Framework Core Table-per-Hierarchy:防止將“未注冊的類”添加為基本類型

[英]Entity Framework Core Table-per-Hierarchy: Prevent "unregistered classes" from being added as base type

我需要為 web 應用程序實現一個簡單的信用系統。 因此,用戶應該能夠通過簡單地付款來獲得積分 eG,或者將其作為做某事的獎勵(如注冊、觀看添加等)。 另一方面,用戶應能夠將這些積分用於 web 應用程序提供的服務(如宣傳其內容、啟用 VIP 身份等)。

我們正在使用 ASP.net Core 3.1 和 Entity Framework Core 構建這個 web 應用程序。 所以我正在考慮在我們的 PostgreSQL 數據庫中使用 TransactionLog。

但為了讓它“更花哨”,我想在我們的 model 中將這些不同類型的事務作為真實類型。 這就是我認為每個層次結構表發揮作用的地方。

我們已經通過 Fluent API 配置了 TpH:

// DbSet Properties
public DbSet<AbstractTransaction> CreditTransactions { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder) {
// Inside OnModelCreating Method:
modelBuilder.Entity<AbstractTransaction>()
    .ToTable("CreditTransactions")
    .HasDiscriminator<string>("TransactionType")
    .HasValue<RegisterBonus>("RegisterBonus")
    .HasValue<SinglePayment>("SinglePayment")
    .HasValue<AcivateVIP>("ActivateVIP")
    .HasValue<PostPromoted>("PostPromoted");
}

class 圖基本上是這樣的:

類圖

到目前為止,這很好用而且很容易。 但是我發現了一個缺點:當向 class 層次結構添加新的事務類型(如NewDebitTransaction )時,而不在 DbContext 中添加相應的.HasValue<NewDebitTransaction>("NewDebitTransaction")時,EF Core 仍然允許我將 object 類型添加到NewDebitTransaction Transaction-Table,但將此條目存儲為AbstractTransaction類型。 我希望得到一些異常告訴我, NewDebitTransaction不是 TpH-Mapping 或其他東西的注冊類型。 相反,EF Core 默默地將我的具體 class 向下轉換為AbstractTransaction ,我永遠無法取回它。

MSDN 文檔指出,可以通過使用.HasBaseType((Type)null)來禁止層次結構中的類型,但我不知道如何將其包含在我的場景中。

目前,這對我來說是一個表演終結者。 因為未來會有很多新的交易類型。 直到有人忘記在 DbContext 中添加相應的.HasValue()調用,我們將AbstractTransactions默默地存儲在數據庫中,這只是時間問題,而不知道它最初是什么類型的事務。

有人知道如何防止 EF Core 將我的類型向下轉換為匹配的抽象類型嗎? 還是 TpH 是解決該問題的錯誤工具?

我還沒有找到使 EF 執行此操作的解決方案,但您可以解決此問題。 一種選擇是使用檢查約束來防止數據庫插入此類值。 像這樣的東西:

modelBuilder.Entity<AbstractTransaction>()
    .HasCheckConstraint("CK_NOT_AbstractTransaction", "TransactionType != \"AbstractTransaction\"")
    ...// rest of set up.

另外我會添加一個單元測試(這樣會更早發現這種錯誤),它將掃描所有AbstractTransaction繼承者的程序集,創建它的一個實例,將其保存到數據庫(內存中的一個應該可以工作),獲取它並檢查TransactionType不是"AbstractTransaction" 雖然這需要公開TransactionType屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM