2011-02-09 11 views
62

Estoy creando un modelo de POCO para usar con el código de entidad de marco primero CTP5. Estoy usando la decoración para hacer un mapa de propiedades a una columna PK. Pero, ¿cómo puedo definir un PK en más de una columna y, específicamente, cómo puedo controlar el orden de las columnas en el índice? ¿Es un resultado del orden de las propiedades en la clase?en el código de la entidad de código primero, cómo usar KeyAttribute en varias columnas

Gracias!

Respuesta

109

Se puede especificar el orden de las columnas en los atributos, por ejemplo:

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 
} 

Si está utilizando el método de un DbSetFind que debe tomar este orden para los parámetros clave en cuenta.

38

Para completar la respuesta correcta presentada por Slauma, se puede utilizar el Haskey método para especificar un pedido de llaves primarias compuestas así:

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

Gracias - ambos métodos no funcionan bien. Prefiero los Atributos porque estoy generando mis clases a partir del código, y los atributos son mucho más concisos. – GilShalit

+0

Personalmente también agregué el Propety (x ...). HasColumnOrder (0 ... n) a cada una de las propiedades con clave. ¿Eso es bueno, malo, indiferente? – Suamere

5

Si, como yo, que prefieren utilizar una configuración archivo que puede hacer que de esta manera (basado en el ejemplo de 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}); 
    } 
} 

Obviamente hay que añadir el archivo de configuración en su contexto:

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

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

uso como un objeto anónimo:

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