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


93

Je crée un modèle POCO à utiliser avec le code de cadre d'entité d'abord CTP5. J'utilise la décoration pour créer une carte de propriété sur 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 le résultat de l'ordre des propriétés dans la classe?

Merci!

Réponses:


153

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 Findméthode a, DbSetvous devez prendre en compte cet ordre pour les paramètres clés.


1
InvalidOperationException: le type d'entité 'XXX' a une clé primaire composite définie avec des annotations de données. Pour définir la clé primaire composite, utilisez l'API fluent.
Luca Ziegler

55

Pour compléter la bonne réponse soumise par Slauma, vous pouvez également 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 
        });
    }
}

2
Merci - les deux méthodes fonctionnent bien. Je préfère les attributs car je génère mes classes à partir de code et les attributs sont beaucoup plus concis.
GilShalit

Personnellement, j'ajoute également la propriété (x ...). HasColumnOrder (0 ... n) à chacune des propriétés saisies. Est-ce que c'est bon, mauvais, indifférent?
Suamere

7

Si, comme moi, vous préférez utiliser un fichier de configuration, vous pouvez le faire de cette manière (sur la base de 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});
    }
}

Evidemment, 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());
    }
}

0

Utiliser comme objet anonyme:

modelBuilder.Entity<UserExamAttemptQuestion>().ToTable("Users").HasKey(o => new { o.UserId, o.Username }); 
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.