web-dev-qa-db-fra.com

dans le code de l'entité en premier, comment utiliser KeyAttribute sur plusieurs colonnes

Je crée un modèle POCO à utiliser avec le code de structure d'entité d'abord CTP5. J'utilise la décoration pour créer une carte de propriété en colonne PK. Mais comment définir une PK sur plusieurs colonnes et comment contrôler l’ordre des colonnes dans l’index? Est-ce un résultat de l'ordre des propriétés dans la classe?

Merci!

81
GilShalit

Vous pouvez spécifier l'ordre des colonnes dans les attributs, par exemple:

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 vous utilisez la méthode Find d'une DbSet, vous devez prendre en compte cet ordre pour les paramètres de clé.

132
Slauma

Pour compléter la réponse correcte envoyée par Slauma, vous pouvez utiliser la méthode HasKey pour spécifier un ordre pour les clés primaires composites:

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 
        });
    }
}
49
Morteza Manavi

Si, comme moi, vous préférez utiliser un fichier de configuration, vous pouvez le faire de cette manière (d'après l'exemple 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});
    }
}

Évidemment, vous devez ajouter le fichier de configuration à votre contexte:

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

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

Utiliser comme objet anonyme:

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