2016-10-01 2 views
0

흥미로운 하나의 비트 여기에서 전에 건너 왔습니다. 우리가 그것을 만든 이유 때문에, 우리는 접합 테이블에 추가 속성을 가지고 말을 충분 - 간결함을 위해 생략EF6의 다 대다 진 엔티티

public class User 
{ 
    public int Id { get; set; } 
} 

public class School 
{ 
    public int Id { get; set; } 
} 

public class UserSchool 
{ 
    [Key] 
    [Column(Order = 1)] 
    public int UserId { get; set; } 

    [Key] 
    [Column(Order = 2)] 
    public int SchoolId { get; set; } 

    [Required] 
    public virtual User User { get; set; } 

    [Required] 
    public virtual School School { get; set; } 
} 

(기타 추가 속성 : 우리는 수동으로 주석을 사용하여 EF6에서 many-to-many 관계를 만들었습니다 명시 적으로)

이렇게 잘 작동합니다. 복잡한 키를 매핑하는 데 유창한 API를 사용할 수 있지만 중요하지 않습니다. 본질적으로 우리는 junction을 통해 두 개의 표준 테이블을 many-to-many로 결합했습니다. 우승자.

지금, 우리는 또한 같은 다른 테이블에 접합 테이블 (UserSchool)에 가입 할 필요 대다 :

public class IPAddress 
{ 
    public int Id { get; set; } 

    public string IPAddress { get; set; } 
} 

public class UserSchoolIPAddress 
{ 
    ?? what to put in here 

    public virtual UserSchool UserSchool { get; set; } 

    public virtual IPAddress IPAddress { get; set; } 
} 

내가 시도한 유창 API 매핑 모두 명명 규칙 및 주석을 통해 ID 속성 지정 : 탐색 엔티티의 속성을 사용하는 것을 좋아하지 않는다고해서 유창한 API 매핑이 실패합니다. 주석으로 바인딩 된 ID는 테이블 스키마에서 UserSchool 속성을 두 번째로 복제하기 때문에 동시성 문제가 발생합니다.

그래서이 시나리오를 처음 접한 사람이 누구이며 해결책을 찾았습니까?

답변

0

좋아, 그래서 나는 바보로 판명되었다. 프레임 워크가 내 시나리오를 실제로 처리 할 것으로 보이지만 속성 유형을 잘못 구성하여 불일치가 있으므로 EF가 새 속성을 복제하려고했습니다.

public class UserSchoolIPAddress 
{ 
    [Key] 
    [Column(Order = 1)] 
    public int UserSchoolUserId { get; set; } 

    [Key] 
    [Column(Order = 2)] 
    public int UserSchoolSchoolId { get; set; } //<-- I had this set to a string for some reason, which broke everything 

    [Key] 
    [Column(Order = 3)] 
    public int IPAddress IPAddressId { get; set; } 

    public virtual UserSchool UserSchool { get; set; } 

    public virtual IPAddress IPAddress { get; set; } 
} 

그래서이 올바르게 "다"끝 FK를 이용한 초 접합 테이블을 생성한다 (이 경우에는 다음과 같이

많은 간 접합 테이블의 완성 정의 따라서 것 IPAddress)와 두 개의 FK를 "junction"끝 (UserSchool)에두고이 세 개의 FK를 모두이 "수퍼 접합"에서 하나의 복합 PK로 결합합니다. EF 잘 했어!

0

접합 테이블도 필요하지 않으므로 엔티티를 올바른 방법으로 구성하면 EF가 자동으로 만듭니다.

많은 사용자가있을 수있는 학교와 학교가 많은 사용자가 있습니다. 이 모델을 만들고 유창한 API를 통해 구성하면 EF가 UserSchool 테이블을 만들고 관리 할 필요가 없습니다 (EF가이 모델을 처리 할 것입니다).

IPAddress 정보 한 모델의 IPAddress는 단일 학교의 단일 사용자가 사용합니다. 일부 탐색 속성이 포함 된 모델이 될 수 있습니다.

public class User 
{ 
    public int Id { get; set; } 
    public virtual ICollection<School> Schools {get; set;} 
    public virtual ICollection<IpAddress> IpAddresses {get; set;} 
} 

public class School 
{ 
    public int Id { get; set; } 
    public virtual ICollection<User> Users {get; set;} 
    public virtual ICollection<IpAddress> IpAddresses {get; set;} 
} 

public class IpAddress 
{ 
    public string Id { get; set; } 
    public virtual User User {get; set;} 
    public virtual School School {get; set;} 
} 
+0

원래의 질문에서 언급했듯이 실제로 우리는 접합 맵핑의 특성으로 추가 데이터를 저장합니다. 예를 들어,'UserSchool' 오브젝트는 실제로 다른 외래 키가 연결되어 있고 권한 레벨이 있습니다. 따라서 수동으로 구성해야합니다. – Katstevens

관련 문제