4

다른 클래스에 관계가있는 기본 클래스를 상속하는 클래스가 있습니다.EF 코드 첫 번째 추상 관계?

예 :

  • 기본 클래스 : 동물
  • 서브 클래스 : 1 개
  • 서브 클래스 2 개 가질 수있는 예방 접종
    • : 고양이
    • 관련 일대 테이블 여러 예방 접종. 이것은 목록 < 백신 접종 >으로 구현됩니다.
    • 고양이는 여러 번 예방 접종을받을 수 있습니다.
    • 예방 접종 기록에는 오직 하나의 동물 만 연관 될 수 있습니다.
    • 예방 접종은 강아지 또는 고양이와 관련이 있는지 알 수 없습니다. (개와 고양이가 비 충돌 GUID를 사용합니다.)

더 동물 테이블이 없습니다; 동물은 추상 클래스입니다. 그러나 예방 접종은 강아지에 관한 것이 아니라 동물에 대해서만 알고 있습니다. (그러나 EF는 둘 다 알고 있습니다.) Animal and Vaccination이 핵심 라이브러리에 있고 Dog가 핵심 라이브러리를 참조하는 다른 라이브러리에있는 것과 같은 클래스 라이브러리를 분할했습니다.

Entity Framework Code First를 사용하는 경우 Vaccinations 테이블에 Dog_ID (Dog 클래스의 List)라는 추가 열이 있습니다. <Vaccination> 명시 적 선언은 추론을 생성합니다. 따라서이 열은 예방 접종 기록을 개로 매핑합니다. 이 추가 열을 여러 유형의 Animal에 걸쳐 공유하려는 경우를 제외하고는 괜찮습니다. 예를 들어, Dog_ID와 Cat_ID를 가지고 있기보다는 Dog 또는 Cat에 참여할 수있는 Animal_ID를 갖고 싶습니다.

동물은 추상적이고 DB 테이블이 없기 때문에 유창한 문이나 속성/속성 선언을 사용하여이를 수행 할 수 있습니까?

답변

3

Vaccination 테이블에는 테이블을 만들고 해당 테이블과 관련을 맺지 않으면 각 백신 유형의 동물에 대해 항상 추가 FK 열이 있습니다. EF는 관계의 매핑과 상위 수준 추상화를 수행 할 수 없습니다. 관계는 데이터베이스에서 직접 작성한 것과 같은 규칙을 따라야합니다.

일부 동물 만 예방 접종을 할 수있는 경우 다른 테이블을 계층에 추가하고 새 테이블과 관계를 맺을 수 있습니다 (EF는 인터페이스에서 작동 할 수 없음). 이를 매핑하려면 Table per Type이 필요하며 현재 EF 버전에서는 쿼리 성능이 훨씬 떨어집니다.

+0

"관계는 데이터베이스에서 직접 관계를 생성하는 것과 동일한 규칙을 따라야합니다." 기술적으로 SQL Server의 여러 테이블에 하나의 열을 가상 외래 키로 연결할 수 있습니다. 나는 EF CF에서 이것을 할 수 있기를 희망했다. –

+0

기술적으로 당신은 하나의 컬럼을 다중 관계로 연관시킬 수 있지만, 휴가는 Dog, Cat 및 다른 것과 관련된 AnimalId를 가지며 한 번 "부모"테이블이 모두 같은 레코드를 가져야 함을 의미합니다. Id = 휴가는 항상 개, 고양이, 고양이와 관련된 ... –

+0

내가 답에 제공 한 TPT 매핑이있는 링크를 확인하십시오. 그리고 동물은 여전히 ​​추상적 일 수 있습니다. –

2

가정의 모든 동물은 그런 다음 CatDog을 상속 Table per Type 매핑을 사용할 수있는 예방 접종

public abstract class Animal 
{ 
    public string ID { get; set; } 
    public ICollection<Vaccination> Vaccinations { get; set; } 
} 

public class Vaccination 
{ 
    public string ID { get; set; } 
    public string AnimalID { get; set; } 
    public virtual Animal Animal { get; set; } 
    //other properties 
} 

있을 것이다.

+0

감사합니다. 괜찮을지 모르지만 유감스럽게도 몇 가지 유형의 동물 만 예방 접종을받을 수 있습니다. 인터페이스가 필요합니다 (예 : ICanHaveVaccinations).이 인터페이스는 기본 클래스가 아니라 상속 된 유형에 대한 지원을 선언합니다. 어쩌면 예방 접종에 AnimalID와 Animal을 선언하는 것만으로도 충분할 것입니다. :) –

+0

@ stimpy77은 'ICanHaveVaccinations' 구현에 대해'Vaccinations' 속성을 선언합니다. (예 : 고양이, 개) – Eranga

+0

네, 이미 가지고 있습니다. –

1

그래서 현재 답변으로 표시되어있는 것을 구현 했으므로 (궁극적으로는 동물 테이블을 만들 필요가 있습니다) 제 질문에서 설명했듯이 문제가 발생했습니다. 개 (Dog) "라고 말하면서이 문제와 관련된 문제에 대해서는 here, herehere이라고합니다.

관련 문제