繁体   English   中英

实体框架TPH继承代码优先类型

[英]Entity Framework TPH Inheritance Code First oftype

我不太确定如何正确解决此问题。

我有一个类Appointment和类AppointmentSeries与继承Appointment

我的数据库是使用TPH首先设置代码的。

现在,当我获取数据库时,我想获取所有类型为Appointment行,而没有AppointmentSeries

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

我读到我必须使用抽象类来获取正确的行为,但是我不想实现抽象类,因此必须在AppointmentAppointmentSeries实现相同的属性。 还是我必须?

我发现的另一个解决方案.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定义DbSetsAppointmentAppointmentSeries

这样,您将不再从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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM