EF 4.1 코드가 먼저 포함 된 복합 키


105

EF 코드 First 4.1 RC를 사용하여 복합 키를 갖는 방법을 알아 내려고합니다.

현재 [Key] Data Annotation을 사용하고 있지만 둘 이상의 키를 지정할 수 없습니다.

복합 키를 어떻게 지정합니까?

내 예는 다음과 같습니다.

 public class ActivityType
{
    [Key]
    public int ActivityID { get; set; }

    [Required(ErrorMessage = "A ActivityName is required")]
    [StringLength(50, ErrorMessage = "Activity Name must not exceed 50 characters")]
    public string ActivityName { get; set; }

}

"ActivityName"도 키가 필요합니다. 물론이 문제를 코딩 할 수 있지만 좋은 데이터베이스 디자인은 아닙니다.

답변:


186

ActivityID및 ActivityName속성을 모두 Key주석으로 표시하거나 @taylonr에서 설명한대로 유창한 API를 사용할 수 있습니다.

편집하다:

이것은 작동합니다. 주석으로 정의 된 복합 키에는 명시적인 열 순서가 필요합니다.

public class ActivityType
{
    [Key, Column(Order = 0)]
    public int ActivityID { get; set; }

    [Key, Column(Order = 1)]
    [Required(ErrorMessage = "A ActivityName is required")]
    [StringLength(50, ErrorMessage = "Activity Name must not exceed 50 characters")]
    public string ActivityName { get; set; }

}

내가 참조. 업데이트 해 주셔서 감사합니다. 답변으로 표시했습니다.
— bugnuker 2011

1
어쨌든 실제로 키가 아닌 고유 한 제약 조건 / 인덱스를 추가하려면?
— Shimmy Weitzhandler 2011

105

주석을 사용하지 않고 대신 모델 작성기를 재정의합니다.이 경우 다음과 같은 작업을 수행 할 수 있습니다.

modelBuilder.Entity<Activity>().HasKey(a => new { a.ActivityId, a.ActivityName });

이것은 작동하지만 작동하는 주석을 기대하고 있습니다. CTP 4가 포함 된 샘플이 있었지만 4.1 RC에서는 더 이상 작동하지 않습니다
— bugnuker 2011 년

3
나는 당신이 주석을 찾고 있다는 것을 알고 있지만 이것이 검색에 도움이 될 것이라고 생각했습니다. 우리가 주석을 사용하지 않는다고 말한 것처럼 나는 거기에서별로 도움이되지 않았습니다. 답을 찾길 바랍니다
— taylonr

14
나는이 접근 방식을 좋아합니다. 컨텍스트 문제가없는 모델을 유지합니다. 고마워.
— ctorx

유창한 API를 사용하여 복합 기본 키 설정이 SQL CE에서 작동하는지 아는 사람이 있습니까? 그것은 나를 위해 작동하지 않으며 ( 'EntityType ...에 키가 정의되어 있지 않다는 오류를 제공합니다.') 새 질문을 만들지 여부가 확실하지 않습니다.
— kasitan 2013-09-05

단위 테스트 목적으로 DbContext를 모의하는 경우 엔터티 및 / 또는 복합 기본 키 간의 관계를 정의하기 위해 modelBuilder가 실행되는지 어떻게 확인합니까?
— Jim Aho
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.