簡體   English   中英

關於 EF Core 中的鑒別器,有沒有辦法用所有值設置基類?

[英]Regarding Discriminator in EF Core, is there a way to set the base class with all values?

我希望在檢索基類時,我應該得到表中的所有行,而不考慮鑒別器。 我只想在檢索派生類之一時使用鑒別器。 我怎樣才能做到這一點?

我嘗試的第一件事是只為派生類設置 HasValue 而不是這樣的基類......

modelBuilder.Entity<BaseClass>(entity =>
{
   entity.HasDiscriminator(e => e.DiscriminatorProperty)
     // .HasValue<BaseClass>()
     .HasValue<DerivedClass1>(1)
     .HasValue<DerivedClass2>(2);
});

...但這給了我以下錯誤:

System.Private.CoreLib.dll 中出現“System.InvalidOperationException”類型的異常,但未在用戶代碼中處理:“實體類型“BaseClass”是層次結構的一部分,但未配置鑒別器值。”

我嘗試的另一件事是為每個可能的鑒別器值配置 BaseClass 像這樣......

modelBuilder.Entity<BaseClass>(entity =>
{
   entity.HasDiscriminator(e => e.DiscriminatorProperty)
     .HasValue<BaseClass>(1)
     .HasValue<BaseClass>(2)
     .HasValue<DerivedClass1>(1)
     .HasValue<DerivedClass2>(2);
});

...但是當實際嘗試檢索基類時,我只得到了鑒別器值為 1 的記錄。EF Core 似乎只識別第一個配置並忽略下一個配置。

所以我的問題是如何專門為派生類而不是基類配置鑒別器? 換句話說,當檢索基類時,我應該得到表中的所有記錄。

EF Core 文檔

在查詢使用 TPH 模式的派生實體時,EF Core 在查詢中添加一個謂詞而不是鑒別器列。 此過濾器確保我們不會為結果中沒有的基本類型或兄弟類型獲得任何額外的行。 對於基本實體類型,將跳過此過濾謂詞,因為查詢基本實體將獲得層次結構中所有實體的結果。

這向我表明您的代碼應該是:

modelBuilder.Entity<BaseClass>(entity =>
{
   entity.HasDiscriminator(e => e.DiscriminatorProperty)
     .HasValue<BaseClass>(0)
     .HasValue<DerivedClass1>(1)
     .HasValue<DerivedClass2>(2);
});

然后,即使您的數據庫只有 1 或 2 的鑒別器值,對BaseClass的查詢也會得到所有行。

當您將派生類保存到數據庫中,然后將其選擇回來時,Entity Framework 將構造派生類並返回它。 這是設計使然。

如果您不需要保存基類的實例,它應該是抽象的。

當然,您始終可以.Select()僅選擇任何特定查詢所需的基類字段。

為避免層次結構問題,您需要將基類標記為抽象。 (您的 modelBuilder 只需要派生類,而不需要基類)

暫無
暫無

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

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