簡體   English   中英

實體框架TPH繼承代碼優先類型

[英]Entity Framework TPH Inheritance Code First oftype

我不太確定如何正確解決此問題。

我有一個類Appointment和類AppointmentSeries與繼承Appointment

我的數據庫是使用TPH首先設置代碼的。

現在,當我獲取數據庫時,我想獲取所有類型為Appointment行,而沒有AppointmentSeries

我嘗試使用OfType<Appointment>()但這也得到了AppointmentSeries

我讀到我必須使用抽象類來獲取正確的行為,但是我不想實現抽象類,因此必須在AppointmentAppointmentSeries實現相同的屬性。 還是我必須?

我發現的另一個解決方案.where(a => !(a is AppointmentSeries))在每個查詢中添加.where(a => !(a is AppointmentSeries)) 但這很難看,我得到了整個數據庫,然后排除了一些行。

有沒有更好的方法來僅獲取約會或將類構造為可以使用OfType<Appointments>()

祝一切順利

卡內雷

我認為您應該嘗試使用抽象類方法。 您不必在兩個派生類中實現相同的代碼。 您要做的是定義一個抽象基類BaseAppointment其中包含當前Appointment類的所有代碼,然后將Appointment定義為一個空類,該類只擴展了基類而內部沒有任何代碼(也許只是一個構造函數,它調用了基本抽象構造函數) :

class Appointment : BaseAppointment 
{
    public Appointment(...some params) : base(...some params) {}
}

AppointmentSeries還擴展了BaseAppointment ,沒有進行進一步的更改(除了構造函數調用基本構造函數之外,它可能已經這樣做了)。

在你DbContext定義DbSetsAppointmentAppointmentSeries

這樣,您將不再從Appointment DbSet獲取AppointmentSeries

如果您不喜歡這種方法,則還可以考慮從TPH更改為TPT(每個類型的表)或TPC(每個具體類的表),並在單獨的表中實現這兩個實體。

否則,我猜您將不得不選擇丑陋且影響性能的.where(a => !(a is AppointmentSeries))或類似的東西。

一個可行的技巧(但也很丑陋):如果AppointmentSeries具有非空屬性,而該屬性在基本Appointment類中未定義,則可以將其用作過濾器。 此屬性在Appointments始終為null ,但在AppointmentSeries not null 您可以在查詢中添加過濾器.where(a => !(a.MyProperty is null)) 我真的不知道這是否比另一個更好。

暫無
暫無

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

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