Entity Framework 핵심 일대 다 관계

c# entity-framework-core one-to-many

문제

한 일대 다 관계를 가진 코드 첫 번째 데이터 모델을 작성하려고합니다.

일대 다 역할을 포함하는 UserDTO 및 RoleDTO 모델이 있습니다.

RoleDTO의 간단한 코드는 다음과 같습니다.

internal class RoleDTO
{
    public UserDTO User { get; set; }

    public string Value { get; set; }

    public RoleDTO()
    {

    }
}

그리고 단순화 된 UserDTO :

internal class RoleDTO
{
    public UserDTO User { get; set; }

    public string Value { get; set; }

    public RoleDTO()
    {

    }
}

그리고 마지막으로 DBContext로부터 상속받은 클래스

internal class RoleDTO
{
    public UserDTO User { get; set; }

    public string Value { get; set; }

    public RoleDTO()
    {

    }
}

추가 마이 그 레이션을 실행할 때 데이터베이스 또는 마이 그 레이션 폴더가 없을 때 (그리고 어쨌든 일부 컬럼을 가지고 실행 한 후에도) 역할 테이블은 사용자의 이메일 주소를 참조하는 추가 컬럼으로 생성됩니다.

필자는 사용자의 전자 메일 주소 인 User 전자 메일 PK에 대한 FK이고 다른 하나는 외래 키와 결합 된 문자열 값인 사용자 역할 테이블에서 2 개의 열만 있으면 사용자 테이블에 복합 기본 키를 만들 수 있습니다 . 아래의 다이어그램 :

internal class RoleDTO
{
    public UserDTO User { get; set; }

    public string Value { get; set; }

    public RoleDTO()
    {

    }
}

누구든지 유창한 API 또는 데이터 주석을 사용하여이를 달성하는 방법을 알고 있습니까?

감사!

수락 된 답변

우선, 클래스 UserDTO 명명 된 속성이없는 User_Email . EF를 사용하여 모델에서 그림자 속성을 정의 할 수 있지만 모델에 있어야한다고 생각하면 클래스에 속성을 정의해야합니다. public string User_Email

유창한 API를 사용하여 모델에서 정의 된 클래스 또는 그림자 속성에 위에 정의 된 속성이 있으면,

복합 기본 키를 정의하려면 HasKey 유창 API를 사용해야합니다. 데이터 주해를 사용하여 복합 기본 키를 정의 할 수 없습니다.

User_Email, Value 를 복합 PK로 정의하려면 User_Email, Value 다음 코드를 OnModelCreating (그런 식으로 그림자 속성을 정의한 후에)

modelBuilder.Entity<UserDTO>().HasKey(e => new { e.User_Email, e.Value });

관계에 외래 키 속성을 지정하려면 fk 속성 / 탐색에 ForeignKeyAttribute 를 사용하거나 HasForeignKey 유창 API를 사용할 수 있습니다.

UserDTO UserRoleDTO ICollection<RoleDTO> Roles 가이 관계에 대한 탐색 UserDTOUserDTO 테이블로 FK로 설정 User_Email .

데이터 주석을 사용하여 User_Email 속성에 ForeignKey("User") 를 작성하거나 네비게이션 ( User / Roles )에 ForeignKey("User_Email") 를 작성하십시오. User_Email 을 그림자 속성으로 사용하고 있다면 이것을 사용할 수 없다는 것을 기억하십시오.

Fluent API를 사용하여 OnModelCreating 에 다음 코드를 OnModelCreating 하여 관계를 완전히 구성하십시오.

modelBuilder.Entity<UserDTO>().HasKey(e => new { e.User_Email, e.Value });

위는 User_Email 을 외래 키 속성으로 사용하는 User & Roles 탐색을 사용하여 일대 다 관계를 만듭니다.

코드가 올바르게 작동하지 않는 이유는

  1. HasKey 사용하여 복합 PK 대신 단일 특성 PK를 정의했습니다.
  2. HasForeignKey 메서드를 사용하여 외래 키 속성을 지정하지 않았으므로 EF가 섀도 속성을 추가합니다. 또한 관계 구성에서 Roles 탐색 만 사용했습니다. EF는 UserDTORoleDTO 사이에 효과적으로 관계를 만드는 User 탐색을 사용하여 또 다른 관계를 만들려고합니다. 이것이 EF가 관례에 따라 외래 키 속성으로 사용할 그림자 속성을 만들었 기 때문에 여분의 열이있는 이유입니다.

인기 답변

나는 당신이 이것을 달성하기 위해 무엇을 시도하는지 모르지만 ORM에서 합성 키로 작업하는 것은 복잡 할 수 있으며 예측할 수없는 영역 일 수 있습니다. 그래서 나는 실제적인 이유가 없다면 복합 키에 반대하는 것이 좋습니다.

난 어디서나 PK로 이메일 주소를 사용하지 않는 것이 좋습니다. 생성 된 고유 한 Int32 / Int64 또는 Guid를 기본 키로 사용하십시오 (관계를 설정하면 Roles 테이블에 외래 키로 반영됨). 그리고 사용자 테이블에있는 전자 메일 열에 인덱스를 지정하십시오. 고유 한 제약 조건. 이주 스크립트에 색인을 추가 할 수 있습니다. 적어도 이메일 주소가 바뀌면 신원을 유지할 수 있습니다 (원하는 경우).

이게 도움이 되길 바란다.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.