2011-02-09 8 views
62

Sto creando un modello POCO da utilizzare con il codice del framework di entità CTP5. Sto usando la decorazione per creare una mappa delle proprietà su una colonna PK. Ma come posso definire un PK su più di una colonna, e in particolare, come posso controllare l'ordine delle colonne nell'indice? È un risultato dell'ordine delle proprietà nella classe?nel codice del framework entità, come utilizzare KeyAttribute su più colonne

Grazie!

risposta

109

È possibile specificare l'ordine delle colonne negli attributi, per esempio:

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 
} 

Se si utilizza il metodo di un DbSetFind si deve prendere questo ordine per i parametri chiave in considerazione.

38

Per completare la risposta corretta presentata da Slauma, è possibile utilizzare il Haskey metodo per specificare un ordine per le chiavi primarie composite così:

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

Grazie - entrambi i metodi funzionano bene. Preferisco gli Attributi perché sto generando le mie classi dal codice e gli attributi sono molto più concisi. – GilShalit

+0

Personalmente aggiungo anche Propety (x ...). HasColumnOrder (0 ... n) a ciascuna proprietà con chiave. È buono, cattivo, indifferente? – Suamere

5

Se, come me, si preferisce utilizzare una configurazione File si può fare in questo modo (in base a esempio di 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}); 
    } 
} 

Ovviamente è necessario aggiungere il file di configurazione per il vostro contesto:

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

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

Usa come un oggetto anonimo:

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