2011-08-11 2 views
5

:한 제로/하나의 관계 (코드 순으로) 나는이 클래스를 시도하고

public class Person 
{ 
    public int PersonID { get; set; } 
    public string Name { get; set; } 
    public int SpouseID { get; set; } 
    public virtual Person Spouse { get; set; } 
} 

의 관계는 다음과 같습니다 한 사람이 '0'또는 배우자/ 한 배우자가 필요한 사람을 가지고있다

Fluent API에서이 모델을 구축 할 수 있습니까?

감사합니다.

답변

6

EF가 고유 키를 지원하지 않기 때문에 불행히도 실제 자체 참조를 일대일 관계로 만들 수는 없습니다. 이 실제 자기 참조를 일대일로 만들려면 SpouseID을 고유 한 것으로 표시해야합니다. EF는 기본 키에만 일대일 대응 (종속 엔터티의 기본 키는 주 엔터티에 대한 외래 키 여야 함)합니다. 즉, 자체 참조하는 일대일 관계가 끝날 것입니다 PersonID <-> PersonID = 단일 테이블에서 동일한 PersonID의 두 엔터티 . PersonID이 기본 키이므로 고유해야합니다. 당신이 알고 않는

당신은 일대로 취급하고 하나의 탐색 속성을 노출 할 수 있습니다 : 당신이 독특한 만드는 수동 custom database initializer을 추가합니다

modelBuilder.Entity<Person>() 
      .HasOptional(p => p.Spouse) 
      .WithMany() 
      .HasForeingKey(s => s.SpouseID); 

데이터베이스의 일대일 관계를 적용하려면 SpouseID 칼럼에 대한 색인.

문제는 단방향 탐색이므로 사람의 배우자를 얻을 수 있지만 그 사람 Spouse에서 남편에게 다시 연락 할 수 없다는 것입니다.

+0

도움 주셔서 감사합니다. Ladislav – Joao

1

이 대답은 정확한 대답 대신 제안입니다.

실제 시나리오에서 이것은 올바른 디자인이 아닙니다. 먼저 모든 배우자는 동일한 사람을 참조하는 배우자도 포함합니다. 예를 들어, 배우자 배우자는 사람 자체입니다. Person과 PeronRelations, PersonRelations는 FromPersonID, ToPersonID, Type 속성을 가지고 있습니다. 이것은 당신이 저장할 수있는 당신이 이점 제공 등

public class Person{ 
    public int PersonID {get;set;} 
    ... 
    public ICollection<PersonRelations> FromRelations {get;set;} 
    public ICollection<PersonRelations> ToRelations {get;set;} 

} 

public class PersonRelations{ 

    .. 
    public int FromPersonID {get;set;} 
    public int ToPersonID {get;set;} 

    public RelationType Type {get;set;} 
    public Person FromPerson {get;set;} 
    public Person ToPersion {get;set;} 

    // useful for Employment and Marriage 
    // durations 
    public DateTime? Start {get;set;} 
    public DateTime? End {get;set;} 
} 

public enum RelationType{ 
    Husband_Wife, 
    Wife_Husband, 
    Father_Son, 
    Son_Father, 
    Friend_Friend, 
    Employee_Employer, 
    Employer_Employee 
} 

- "> 아버지의 아들 <"- "아버지 <> 아들"- "> 남편 아내 <", - 유형 "> 아내 남편 <"를 지정합니다 관계별로 더 많은 정보를 얻고 많은 쿼리와 함께 양방향으로 탐색 할 수 있습니다.

모든 관계에는 상응하는 반대의 관계가 있습니다. 그리고 제대로 작동하려면 올바른 역관계를 유지하기 위해 추가 로직을 작성해야합니다.

간단한 일대 다 관계이므로 Entity Framework에서 구현하기가 매우 쉽습니다.

관련 문제