实体框架TPH继承代码

本文关键字:代码 继承 TPH 框架 实体 | 更新日期: 2023-09-27 18:15:33

我不太确定如何正确地解决这个问题。

我有一个继承自Appointment的类Appointment和类AppointmentSeries

我的数据库设置代码优先与TPH。

现在当我获得数据库时,我想获得所有Appointment类型的行,没有AppointmentSeries

我尝试使用OfType<Appointment>(),但这也得到AppointmentSeries

我读到我必须使用抽象类来获得正确的行为,但我不想实现抽象类,所以我必须在AppointmentAppointmentSeries中实现相同的属性。还是我必须这么做?

我发现的另一个解决方案是将.where(a => !(a is AppointmentSeries))添加到每个查询中。但这是丑陋的,我得到整个数据库,然后排除一些行。

是否有更好的方法只获得约会或结构我的类,我可以使用OfType<Appointments>() ?

祝一切顺利

Canere

实体框架TPH继承代码

我认为你应该尝试一下抽象类的方法。您不必在两个派生类中实现相同的代码。您所做的是定义一个抽象基类BaseAppointment,其中包含当前Appointment类的所有代码,然后将Appointment定义为一个空类,仅扩展基类而不包含任何代码(可能只是调用基抽象构造函数的构造函数):

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

AppointmentSeries也扩展了BaseAppointment,没有进一步的变化(除了构造函数调用基构造函数,它可能已经这样做了)。

DbContext中,您为AppointmentAppointmentSeries定义了DbSets

有了这个,你将不再从Appointment DbSet得到AppointmentSeries

如果你不喜欢这种方法,你也可以考虑从TPH改为TPT(每类型表)或TPC(每具体类表),并在单独的表中实现这两个实体。

否则我猜你将不得不选择丑陋和影响性能的.where(a => !(a is AppointmentSeries))或类似的东西。

一个可以工作的技巧(但它也很丑):如果你的AppointmentSeries有一个非空属性,没有在基本Appointment类中定义,你可以使用它作为过滤器。该属性在Appointments中始终为null,在AppointmentSeries中始终为not null。您可以在查询中添加过滤器.where(a => !(a.MyProperty is null))