먼저 엔터티 프레임 워크 코드에서 여러 열에 KeyAttribute를 사용하는 방법


93

엔티티 프레임 워크 코드 우선 CTP5와 함께 사용할 POCO 모델을 만들고 있습니다. 장식을 사용하여 PK 열에 속성 맵을 만듭니다. 그러나 두 개 이상의 열에서 PK를 어떻게 정의 할 수 있습니까? 특히 인덱스의 열 순서를 어떻게 제어 할 수 있습니까? 클래스의 속성 순서의 결과입니까?

감사!

답변:


153

다음과 같이 속성에서 열 순서를 지정할 수 있습니다.

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

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

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

    // other properties
}

Finda 의 방법을 사용하는 경우 DbSet주요 매개 변수에 대해이 순서를 고려해야합니다.


1
InvalidOperationException : 항목 유형 'XXX'에 데이터 주석으로 정의 된 복합 기본 키가 있습니다. 복합 기본 키를 설정하려면 유창한 API를 사용하십시오.
Luca Ziegler

55

Slauma가 제출 한 정답을 완료하려면 HasKey 메서드를 사용하여 복합 기본 키의 순서도 지정할 수 있습니다.

public class User
{        
    public int UserId { get; set; }       
    public string Username { get; set; }        
}        

public class Ctp5Context : DbContext
{
    public DbSet<User> Users { get; set; }        

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().HasKey(u => new 
        { 
            u.UserId, 
            u.Username 
        });
    }
}

2
감사합니다-두 방법 모두 잘 작동합니다. 코드에서 클래스를 생성하고 속성이 훨씬 간결하기 때문에 속성을 선호합니다.
GilShalit

개인적으로 각 키 속성에 Propety (x ...). HasColumnOrder (0 ... n)을 추가합니다. 그게 좋고 나쁘고 무관심한가요?
Suamere 2015 년

7

저처럼 구성 파일을 선호한다면 다음과 같이 할 수 있습니다 (Manavi의 예를 기반으로 함).

public class User
{
    public int UserId { get; set; }
    public string Username { get; set; }
}  

public class UserConfiguration : EntityTypeConfiguration<User>
{
    public UserConfiguration()
    {
        ToTable("Users");
        HasKey(x => new {x.UserId, x.Username});
    }
}

당연히 컨텍스트에 구성 파일을 추가해야합니다.

public class Ctp5Context : DbContext
{
    public DbSet<User> Users { get; set; }        

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
         modelBuilder.Configurations.Add(new UserConfiguration());
    }
}

0

익명 개체로 사용 :

modelBuilder.Entity<UserExamAttemptQuestion>().ToTable("Users").HasKey(o => new { o.UserId, o.Username }); 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.