簡體   English   中英

將ASP.NET Core實體框架核心中的繼承類強制為專用的MySQL表

[英]Force inherited classes in ASP.NET Core Entity Framework Core to dedicated MySQL table

有一個模型Thread應該計算另一個稱為Post模型的所有屬性,我使用繼承:

class Post {
    public int Id{get;set;}
    public string Title{get;set;}
    // ...
}
class Thread: Post {
    public int ForumId{get;set;}
    // ...
}

EF Core將它們放在一個表中,並添加了Discriminator列。 它包含類的名稱,以便.NET Core可以將其序列化為正確的類型。

我的目標是:

  • 具有Post模型中所有屬性的Table Post
  • 具有來自模型ThreadPost所有屬性的表Thread

為什么?

  1. 我假設兩個表在將來都會大量增長
  2. 它炸毀了我的數據庫,因為表定義包含來自Thread行,這些行在Post行中始終為空
  3. 從開發人員的角度來看,它看起來並不干凈而且不正確

我已經嘗試過的

  • 在我的DbContextPostThread創建兩個不同的DbSet<T>
  • OnModelCreating為每個實體添加builder.Entity<Post>().ToTable("Post")
  • 在類定義上使用[Table("Post")]裝飾器
  • 將共享屬性移至抽象框架,並讓PostThread從其繼承

某種解決方法

最后一個作品:

class Content {
    // Shared Attributes like Title
}
class Post: Content {}
class Thread: Content {}

但這會在鏈接實體時引起問題。

您所描述的稱為TPC(即每表具體類型)關系模式,目前在Entity Framework Core中不受支持。 您可以在此處關注相關問題

目前尚無此功能的里程碑,因此,如果您絕對必須執行TPC,則唯一的選擇是使用EF6或其他支持此關系策略的替代ORM,而不是EF Core。

就個人而言,我建議您堅持使用EF Core,而僅使用TPH(按表分層)或TPT(按表分層)關系策略。 前者實際上是默認值,並且將為這兩者生成一個表,其中Discriminator列指示實際類型。 后者是使用ToTable fluent config或[Table]屬性時得到的結果,並為包含所有共享屬性的基本類型創建一個表,然后為每個派生類型創建一個表,僅包含該屬性的屬性類型,並使用外鍵返回基本類型的表。 在帖子和線程之間有很強的關系,在數據庫級別實際維護這種關系很有價值。

暫無
暫無

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

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