112 votes

dans le code du cadre de l'entité d'abord, comment utiliser KeyAttribute sur plusieurs colonnes

Je suis en train de créer un modèle POCO à utiliser avec le code entity framework first CTP5. J'utilise la décoration pour faire correspondre une propriété à une colonne PK. Mais comment puis-je définir un PK sur plus d'une colonne, et plus précisément, comment puis-je contrôler l'ordre des colonnes dans l'index ? Est-ce un résultat de l'ordre des propriétés dans la classe ?

Gracias.

168voto

Slauma Points 76561

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 le Find méthode d'un DbSet vous devez tenir compte de cet ordre pour les paramètres clés.

71voto

Morteza Manavi Points 20486

Pour compléter la réponse correcte soumise par Slauma, vous pouvez utiliser le bouton HasKey pour spécifier un ordre pour les clés primaires composites également :

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

12voto

Daniele Armanasco Points 1686

Si, comme moi, vous préférez utiliser un fichier de configuration, vous pouvez le faire de cette façon (en vous basant sur 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});
    }
}

Vous devez évidemment 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());
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X