2011-07-26 2 views
1

코드에 먼저 매핑하려는 복잡한 데이터베이스가 있지만 두 개의 별도 클래스로 분할해야하는 테이블에 문제가 있습니다.EF 코드 첫 번째 여러 클래스를 한 테이블에 매핑

Site 
---- 
Id 
Name 

Person 
------ 
Id 
Name 
Dob 
Address 
Rank 
Age 
SiteId 

PersonRoleLink 
-------------- 
PersonId 
RoleId 

Role 
---- 
Id 
Name 

는 기본적으로 사이트가 많은 사람들을 가지고 있으며, 각 사람이 많은 역할을 할 수 있습니다 : 다음과 같이 테이블 구조의

기본 예입니다.

사람의 역할에 따라 채워지는 속성이 결정됩니다. 다음과 같이

이상적으로 나는 클래스 구조를 싶습니다

Customer, EmployeeManager 모두가 Person 테이블에서 와서 PersonRoleLink 테이블의 관련 링크에 의존
public class Site { 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Customer> Customers { get; set; } 
    public virtual ICollection<Employee> Employees { get; set; } 
    public virtual ICollection<Manager> Managers { get; set; } 
} 

public class PersonBase { 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual Site Site { get; set; } 
} 

public class Customer : PersonBase { 
    public string Name { get; set; } 
    public DateTime Dob { get; set; } 
} 

public class Employee: PersonBase { 
    public int Age { get; set; } 
} 

public class Manager: PersonBase { 
    public int Rank { get; set; } 
} 

.

그래서 반환 Person 테이블에 Site.Managers 행 뭔가를 호출 할 때 올바른 SiteId와 '관리자'

라는 Role에 대한 링크를 가진 사람이 첫 번째 코드에서이 구조 가능하다? 그렇다면이 매핑이 어떻게 이루어지며 그렇지 않은 경우이 구조에 대한 실행 가능한 대안이 있습니까?

감사

답변

1

그것이 데이터 구동 매핑 및 EF 코드는 먼저 하나의 예외를 제외하고 지원하지 않기 때문에이 EF 불가능 : 매핑 테이블의 하나의 열 값에 매핑 달라질 수 계층 상속 매핑 당 도표 하위 개체. 귀하의 경우 엔티티의 유형이 다른 값은 두 개의 관계가 떨어져 있습니다. 또한 사람 테이블의 레코드 하나는 여러 엔터티 인스턴스를 나타낼 수 있습니다. 이러한 인스턴스에는 고유 키가 없으므로 EF가이를 수행 할 수 없으므로 또 다른 문제점이 있습니다.

일반적으로 직원 및 관리자 인 독신자를 가질 수 있으므로 예상되는 개체 모델이 잘못되었습니다. 그것은 두 개의 다른 "Person"객체가되어서는 안됩니다. 사용자 Person은 역할에 탐색 속성을 직접 적용하고 관리자, 직원 및 고객을 확보 할 수있는 도우미 메서드를 만듭니다.

+0

위대한 답변, 감사합니다. – lancscoder

관련 문제