[英]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.