entity framework - framework - primero en el código del marco de la entidad, cómo usar KeyAttribute en múltiples columnas
entity framework key (4)
Estoy creando un modelo de POCO para utilizar con el código de estructura de entidad 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?
¡Gracias!
Para completar la respuesta correcta enviada por Slauma, puede utilizar el método HasKey para especificar también un orden para las claves primarias compuestas:
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
});
}
}
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 Find
de un DbSet
, debe tener en cuenta este orden para los parámetros clave.
Si, como yo, prefiere usar un archivo de configuración, puede hacerlo 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, debes agregar el archivo de configuración a tu contexto:
public class Ctp5Context : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new UserConfiguration());
}
}
Usar como un objeto anónimo:
modelBuilder.Entity<UserExamAttemptQuestion>().ToTable("Users").HasKey(o => new { o.UserId, o.Username });