1

우리는 고전적인 ADO.NET 기술을 사용하여 성공적으로 실행되는 대규모 엔터프라이즈 응용 프로그램을 보유하고 있습니다. 우리는 EF 6을 사용하여 고전적인 기술에 필요한 배관 공사를 줄일 수 있는지 실험하고 있습니다. (이 중 하나의 장단점으로 답하지 마십시오. 숙제를 완료했습니다.)EntityFramework 코드 First 및 사용자 지정 상속

EF Code First 접근법을 기존 코드와 가장 잘 어울리는 것으로 결정했습니다. 우리는 EF 모델 클래스에서 특정 상속 체계를 표현할 수 밖에 없습니다.

ProfileId (Identity) 및 ProfileNumber 열이있는 Profiles라는 테이블이 있습니다. 기본 세부 사항은 약간 복잡하지만 간단한 단어로 입력하려고하면 ProfileId가 기본 키입니다. ProfileNumber는 프로파일 유형에 따라 고유하지 않거나 다를 수 있습니다. 예 : 에이전트 프로파일의 경우 ProfileNumber를 Profiles 테이블에서 반복 할 수 없습니다.

프로필 테이블에 외래 키로 ProfileNumber를 갖는 AgentDetails라는 다른 테이블이 있습니다 (AgentDetails 테이블에 ProfileId 열 없음). 스키마 변경을 제안하지 마십시오. 이는 단순히 우리가 가지고있는 배포 유형으로는 불가능합니다.

이제 코드에서 모든 속성을 가진 프로필 클래스를 만들었습니다. 우리는 Profile에서 파생 된 Agent라는 또 다른 클래스를 만들었습니다. 프로필 클래스에서 상속 된대로 ProfileNumber를 제외한 AgentDetails 테이블의 모든 열에 대한 속성을가집니다.

모든 프로필 클래스 파생 속성도 채워지는 에이전트 개체를 반환하는 LINQ 쿼리를 작성하려고합니다. 그러나 다양한 LINQ 쿼리 (명시 적 조인이 있든 없든)를 시도한 후에는 아무 것도 성공하지 못합니다. ProfileId 열에는 항상 LINQ 쿼리의 결과 집합에 ProfileId 열이 없다는 오류가 표시됩니다.

이 상황에서 DbContext 및 DbSet 및 Linq 쿼리를 사용하여 ProfileNumber의 Profiles 테이블과 AgentDetails를 조인하고 기본 프로필 속성도 채워지는 에이전트 개체 목록을 반환하는 LINQ 식을 작성할 수 있습니까?

이 작업을 수행하기 위해 다양한 DataAnnotation 속성을 사용해 보았지만 (Fluent API는 살펴 보지 못했지만 성공하지 못했습니다.)

Agent 개체가 Profile 개체를 포함 할 때까지 대기하지 않으므로 프로필에서 상속하도록합니다. This blog post은 관계가 데이터베이스에 명시 적으로 정의 된 경우에도 동일하게 적용됩니다. 우리의 경우에는 AgentDetails와 Profiles 테이블 사이에 데이터베이스에 외래 키 관계가 정의되어 있지 않습니다.

물론,이 경우에는 DataReader를 사용하고 수동으로 개체 속성을 채 웁니다. 우리는이 작업을 수행하는 네이티브 EF 접근 방식이 있는지 확인하려고 노력하고 있습니다. 그렇지 않으면 좋은 오래된 데이터 판독기를 위임 할 수 있습니다.

UPDATE : 여기에 코드의 골격 버전입니다 : 여기

Table("Profiles")] 
public class Profile 
{ 
    public int ProfileId {get; set;} 
    public string ProfileNumber {get;set;} 
    public string FullName {get;set;} 
} 

Table("AgentDetails")] 
public class Agent : Profile 
{ 
    //Notice I omitted ProfileNumber column, that's present in AgentDetails in database, but inherited from Profile class here. 
    public decimal CommissionPct {get;set;} 
} 

은 샘플 쿼리입니다 :

//Basically trying to get a list of all agents 
this.context.Agents.ToList(); 

우리가 얻을 오류는 다음과 같습니다

잘못된 열이

을 profileID가

+1

linq 쿼리, 예외 세부 정보, 최소 버전의 프로필 및 에이전트 클래스와 같은 일부 코드를 공유하십시오. – jessehouwing

+0

안녕하세요 jesse, 자세한 내용으로 질문을 업데이트했습니다. 시간을내어 주셔서 감사합니다. –

+0

이 말이 맞습니까? 테이블에 매핑 된 상속을 사용하지 않고 다중 테이블로 매핑 된 상속을 사용하고 있습니다. (참조 : http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/implementing-inheritance-with-the-entity-framework-in-an-asp -net-mvc-application) 전체 엔티티를 구성 할 수 있도록 AgentDetails에서 Profile 테이블로 ProfileNumber를 매핑하는 방법을 EF에 설명해야합니다. ModelBuilder에게 의도를 알려줘야합니다. 이 줄에있는 항목 : http://stackoverflow.com/a/6850481/736079 – jessehouwing

답변

0

먼저 프로필 엔티티에 특정 기본 키가 있습니다. DbContext에만 DbSet을 설정하면 에이전트가 올바르게 작동하고 올바르게 작동합니다.

관련 문제