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

ActivityIDActivityName속성을 모두 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.