[英]Entity Framework TPH Inheritance Code First oftype
我不太確定如何正確解決此問題。
我有一個類Appointment
和類AppointmentSeries
與繼承Appointment
。
我的數據庫是使用TPH首先設置代碼的。
現在,當我獲取數據庫時,我想獲取所有類型為Appointment
行,而沒有AppointmentSeries
。
我嘗試使用OfType<Appointment>()
但這也得到了AppointmentSeries
。
我讀到我必須使用抽象類來獲取正確的行為,但是我不想實現抽象類,因此必須在Appointment
和AppointmentSeries
實現相同的屬性。 還是我必須?
我發現的另一個解決方案.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
定義DbSets
的Appointment
和AppointmentSeries
。
這樣,您將不再從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.