2011-02-09 16 views

Odpowiedz

109

Można określić kolejność kolumn w atrybutach, na przykład:

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 
} 

Jeśli używasz metody w DbSetFind należy przyjmować tego zlecenia dla kluczowych parametrów pod uwagę.

38

Aby wykonać poprawną odpowiedź przedstawioną przez Slauma można użyć HasKey metodę, aby określić kolejność dla złożonych kluczy podstawowych, a także:

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

Dzięki - obie metody działają dobrze. Preferuję atrybuty, ponieważ generuję klasy z kodu, a atrybuty są o wiele bardziej zwięzłe. – GilShalit

+0

Ja osobiście dodam również Propety (x ...). HasColumnOrder (0 ... n) do każdej z właściwości klucza. Czy to jest dobre, złe, obojętne? – Suamere

5

Jeśli, tak jak ja, wolą korzystać z konfiguracji plik może to zrobić w ten sposób (w oparciu o przykład Manavi za):

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}); 
    } 
} 

Oczywiście trzeba dodać plik konfiguracyjny do kontekstu:

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

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

Zastosowanie jako anonimowego obiektu:

modelBuilder.Entity<UserExamAttemptQuestion>().ToTable("Users").HasKey(o => new { o.UserId, o.Username });