1

ID 열이 기본 키로 포함 된 테이블이 있습니다. 실제로 FK 인 두 개의 다른 열에 고유성을 적용해야한다는 요구 사항이 있습니다. SQL Server에서이 두 열에 대해 UniqueKey를 만들 수 있습니다.고유 한 복합 키의 EF CodeFirst 유효성 검사

EF 측에서이 두 필드의 고유성을 확인할 수 있도록하려면 어떻게해야합니까?

답변

2

EF는 고유 키를 지원하지 않으므로 데이터베이스에서 고유 키를 사용하고 저장 중에 예외를 catch하는 것이 가장 좋습니다. 데이터베이스를 생성하는 동안 EF가 고유 키를 생성해야하는 경우 use custom initializer 수 있습니다.

응용 프로그램에서 일부 유효성 검사를 수행하려면 일부 쿼리를 실행하고 이러한 데이터가 아직 존재하지 않는지 확인해야하지만 이전 조언을 catch 예외와 함께 사용해야 할 것이므로 다른 스레드/프로세스/사용자는 쿼리와 변경 사항 저장간에 이러한 데이터를 만들 수 있습니다.

+0

안녕하세요,이 질문을 게시하기 전에 안녕하세요, 귀하의 게시물을 이미 보았습니다. 쿼리를 실행하면 무엇을 의미합니까? 여기에 두 가지 가능한 문제가 있습니다. 1) 데이터 값의 기존 값과 새 값을 비교해야하며 2) 메모리 데이터에 중복 값이 ​​있으므로 두 번째 레코드의 삽입/업데이트가 실패합니다. 이 시나리오에서 DataAnnotations를 적용 할 수 없다고 생각하십니까? – Goran

+0

다른 컨텍스트 인스턴스에서 동일한 값을 메모리에 가질 수 있기 때문에 데이터 주석을 적용 할 수 없습니다. 이 경우 데이터 주석에 의한 유효성 검사는 통과하지만 실제 유효성 검사는 데이터베이스에서만 발생합니다. –

-1

POCO 클래스에서 키로 고유해야하는 각 열을 표시하십시오. 다음과 같이 :

public MyPocoClass { 
    [Key, Column(Order = 0)] 
    public int Id { get; set; } 

    [Key, Column(Order = 1)] 
    public int Col2name { get; set; } 


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

기본 키 열이 모두 SQL DB에 함께 표시되도록 열 순서를 설정하면 유용합니다.

열이 다른 Entity Framework 코드의 첫 번째 클래스에 대한 외래 키인 경우 속성을 tablename_tableId로 지정하면 EF가 나머지 작업을 수행합니다. 예.

public anotherClass { 
     public int Id { get; set; } 

     public int MyPocoClass_Id { get; set; } //this is a foreign key 

    } 
+0

당신은 무엇을 의미합니까? EF는 나머지를 할 것입니까? 내 질문에 대해 오해 한 것 같아. 같은 Col2Name 및 Col3Name 값을 가진 레코드가 두 개있는 경우 클라이언트 측에서 어떻게 확인할 수 있습니까? – Goran

+0

Entity Framework는 외래 키에 대한 유효성 검사를 처리하며 고유하지 않은 행을 삽입하려고하거나 다른 테이블의 키로 외래 키가 존재하지 않으면 Context에서 예외가 발생합니다. 그게 도움이 되니? –

+0

아니요. QUERY가 데이터베이스로 실행되는 시점에 이르면 EF가 유효성 검사를 전혀 처리하지 못한다는 의미입니다. 내 질문은 : 데이터를 검증하기 위해 EF/클라이언트 측에서 할 수있는 일은 무엇입니까? – Goran

관련 문제