实体框架TPH继承代码
本文关键字:代码 继承 TPH 框架 实体 | 更新日期: 2023-09-27 18:15:33
我不太确定如何正确地解决这个问题。
我有一个继承自Appointment
的类Appointment
和类AppointmentSeries
。
我的数据库设置代码优先与TPH。
现在当我获得数据库时,我想获得所有Appointment
类型的行,没有AppointmentSeries
。
我尝试使用OfType<Appointment>()
,但这也得到AppointmentSeries
。
我读到我必须使用抽象类来获得正确的行为,但我不想实现抽象类,所以我必须在Appointment
和AppointmentSeries
中实现相同的属性。还是我必须这么做?
我发现的另一个解决方案是将.where(a => !(a is AppointmentSeries))
添加到每个查询中。但这是丑陋的,我得到整个数据库,然后排除一些行。
是否有更好的方法只获得约会或结构我的类,我可以使用OfType<Appointments>()
?
祝一切顺利
Canere
我认为你应该尝试一下抽象类的方法。您不必在两个派生类中实现相同的代码。您所做的是定义一个抽象基类BaseAppointment
,其中包含当前Appointment
类的所有代码,然后将Appointment
定义为一个空类,仅扩展基类而不包含任何代码(可能只是调用基抽象构造函数的构造函数):
class Appointment : BaseAppointment
{
public Appointment(...some params) : base(...some params) {}
}
AppointmentSeries
也扩展了BaseAppointment
,没有进一步的变化(除了构造函数调用基构造函数,它可能已经这样做了)。
在DbContext
中,您为Appointment
和AppointmentSeries
定义了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))
。