0

이 문제를 올바르게 해결하는 방법을 잘 모르겠습니다.Entity Framework TPH 상속 코드 첫 번째 형식

나는 Appointment 클래스를 가지고 있으며 에서 상속 된 클래스 AppointmentSeries을 가지고 있습니다.

데이터베이스가 코드 첫 번째로 TPH로 설정되었습니다.

이제 데이타베이스를 얻을 때, 없이 Appointment 유형의 모든 행을 가져 오려고합니다.

OfType<Appointment>()을 사용해 보았지만이 역시 AppointmentSeries이됩니다.

올바른 동작을 얻기 위해 추상 클래스를 사용해야한다는 것을 알았지 만 추상 클래스를 구현하지 않으므로 AppointmentAppointmentSeries에 동일한 속성을 구현해야합니다. 아니면해야합니까?

다른 해결책은 모든 쿼리에 .where(a => !(a is AppointmentSeries))을 추가하는 것입니다. 그러나 이것은 추한 것이며 전체 데이터베이스를 얻은 다음 일부 행을 제외시킵니다.

약속이나 구조를 얻는 더 좋은 방법은 OfType<Appointments>()입니까?

모든 최고의

Canere

+2

"약속을 지키지 않고 약속하기"는 그들이 상속을 시작하기에 좋은 후보자가 아님을 의미합니다. 현재 귀하의 AppointmentSeries는 an__ Appointment입니다. –

답변

0

난 당신이 추상 클래스의 접근 시도를 제공한다고 생각합니다. 파생 클래스 모두에서 동일한 코드를 구현할 필요가 없습니다. 당신은 현재 Appointment 클래스의 모든 코드를 포함하는 추상 기본 클래스 BaseAppointment을 정의한 다음 Appointment을 정의하고 빈 클래스처럼 코드를 사용하지 않고 기본 클래스를 확장합니다 (기본 추상 생성자를 호출하는 생성자 일 수도 있음) :

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

AppointmentSeries도 (아마 이미 수행뿐만 아니라 기본 생성자를 호출 생성자에서 떨어져) 더 이상의 변화, BaseAppointment를 확장합니다.

DbContextAppointmentAppointmentSeries에 대해 DbSets을 정의하십시오.

AppointmentDbSet에서 더 이상 AppointmentSeries이 표시되지 않습니다.

이 방법이 마음에 들지 않으면 TPH에서 TPT (테이블 당 유형) 또는 TPC (콘크리트 별 표)를 변경하고 두 엔티티를 별도의 테이블에 구현하는 것도 고려해 볼 수 있습니다.

그렇지 않으면 추한 성능에 영향을 미치는 .where(a => !(a is AppointmentSeries)) 또는 유사한 것으로 이동해야 할 것입니다.

트릭이 작동 할 수 있지만 (추한 것도 있습니다.) AppointmentSeries에 기본이 아닌 Appointment 클래스에 정의되지 않은 nullable 속성이 있으면이를 필터로 사용할 수 있습니다. 이 속성은 항상 nullAppointments이지만 not nullAppointmentSeries입니다. 검색어에 .where(a => !(a.MyProperty is null)) 필터를 추가 할 수 있습니다. 나는 이것이 다른 하나보다 나은 성능을 가지고 있는지 정말로 모른다.