2017-02-22 1 views
0

FluentAPI를 사용하여 몇 가지 테이블을 매핑하는 것과 관련하여 문제를 해결하는 방법에 대해 조언 할 수 있는지 궁금했습니다.비정상적인 테이블 관계 매핑

ID 이라는 키가있는 상위 테이블이 있습니다. 그런 다음 idB가 두 개 필드 인 idA & 인 하위 테이블이 있습니다.

상위 테이블의 기본 키가 idA 또는 idB 중 하나에 연결되며 둘 다에 연결되지 않습니다.

public Parent() 
    { 
     this.ChildA = new HashSet<Child>(); 
     this.ChildA = new HashSet<Child>(); 
    } 
    public virtual ICollection<Child> ChildA { get; set; } 
    public virtual ICollection<Child> ChildB{ get; set; } 
} 

public Child() 
    public virtual Parent parent { get; set; } 
} 

레거시이며 변경할 수 없기 때문에 관계/테이블 디자인에 대해 할 수있는 일이 많습니다. 이 문제를 설명하기 위해 올바른 FluentAPI를 이해하기 만하면됩니다. 내가

modelBuilder.Entity<Child>().HasRequired<Parent>(p => p.parent).WithMany(q => q.childs).HasForeignKey(r => r.idA); 
modelBuilder.Entity<Child>().HasRequired<Parent>(p => p.parent).WithMany(q => q.childs).HasForeignKey(r => r.idB); 

답변

0

... 뭔가 같은과 함께 필요한 것 예상 무슨 위의 예 나는 당신이 찾고있는 정확한 매핑을 얻을 수 있었다 생각합니다. Entity Framework가 코드에서 외래 키를 사용하는 방법을 알 수 있도록 POCO에 탐색 속성을 추가했습니다. 이미 외래 키 열을 기존에

public class Child 
{ 
    public int Id { get; set; } 
    public virtual Parent ParentA { get; set; } 
    public virtual Parent ParentB { get; set; } 

    public Child() { } 
} 

은 내가 FluentAPI Map 방법을 사용, 이러한 탐색 속성을 매핑합니다. 이와
modelBuilder.Entity<Child>().HasRequired<Parent>(p => p.ParentA).WithMany(q => q.ChildA).Map(m => m.MapKey("idA")).WillCascadeOnDelete(false); 
modelBuilder.Entity<Child>().HasRequired<Parent>(p => p.ParentB).WithMany(q => q.ChildB).Map(m => m.MapKey("idB")).WillCascadeOnDelete(false); 

, 나는 ParentAChildA 수집을 채 웁니다 표명하고, ParentBChildB 수집을 채 웁니다. Map 메서드를 사용하면 기존 FK에 매핑 할 수 있으므로 POCO에 속성으로 포함 할 필요가 없습니다.

테이블에 매핑되는 각 POCO에는 기본 키가 있어야합니다. 기존의 자식 테이블에 PK가 있습니까? 그렇지 않은 경우 문제가 발생할 수 있습니다. 나는 그것에 대해이 게시물을 읽는 것이 좋습니다. Entity Framework: table without primary key

+0

자식 테이블에 PK가 전혀 없습니다. 이 어리석은 참조 두통. 고맙습니다. 좋은 결과를 주겠다. 정말로 도움을 주셔서 감사합니다. –