0

この問題を正しく解決する方法がわかりません。エンティティフレームワークTPH継承コード最初の型

私はクラスAppointmentと、Appointmentから継承したクラスAppointmentSeriesを持っています。

私のデータベースはTPHでコードファーストに設定されています。

データベースを取得したら、タイプAppointmentのすべての行をAppointmentSeriesなしで取得したいとします。

OfType<Appointment>()を使ってみましたが、これもAppointmentSeriesになりました。

私は正しい動作を取得するために、抽象クラスを使用しなければならないことを読んで、私は、私はAppointmentAppointmentSeriesで同じプロパティを実装する必要がありますので、抽象クラスを実装する必要はありません。または私はする必要がありますか?

他の解決策は、すべてのクエリに.where(a => !(a is AppointmentSeries))を追加することでした。しかし、これは醜いです、私はデータベース全体を取得し、いくつかの行を除外します。

アポイントだけを取得したり、クラスを構造化したりするより良い方法がありますか?OfType<Appointments>()を使用できますか?

すべてのベスト

Canere

+2

"AppointmentSeriesを使わないで予約する"というのは、彼らが継承を始めるには良い候補者ではなかったということです。現在、あなたのAppointmentSeries __はan__ Appointmentです。 –

答えて

0

私はあなたが抽象クラスのアプローチに試してみるべきだと思います。両方の派生クラスに同じコードを実装する必要はありません。あなたは現在のAppointmentクラスのすべてのコードを含む抽象基本クラスBaseAppointmentを定義してから、コードを使わずに基本クラスを拡張した空のクラスのようにAppointmentを定義します(基本抽象コンストラクタを呼び出すコンストラクタ) :

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

AppointmentSeriesも(それはおそらく既に行いならびに塩基コンストラクタを呼び出すコンストラクタから離れて)ないさらなる変更を、BaseAppointmentを拡張します。

DbContextには、AppointmentAppointmentSeriesにはDbSetsを定義します。

これで、AppointmentDbSetからAppointmentSeriesが取得されなくなります。

この方法が嫌いなら、TPHからTPT(表ごと)またはTPC(表コンクリートクラス)から別の表に両方のエンティティを実装することもできます。

それ以外の場合は、醜いパフォーマンスに影響を与える.where(a => !(a is AppointmentSeries))またはそれに類似するものを使用しなければならないと思います。

あなたのAppointmentSeriesがベースで定義されていないnull値のないプロパティを持っている場合は、それをフィルタとして使用できます(醜いこともあります)。このプロパティは、nullAppointmentsになりますが、not nullAppointmentSeriesになります。フィルタ.where(a => !(a.MyProperty is null))をクエリに追加できます。これは他のものより優れた性能を持っているかどうかは分かりません。

関連する問題