prima nel codice del framework dell'entità, come utilizzare KeyAttribute su più colonne


93

Sto creando un modello POCO da utilizzare con il codice del framework dell'entità prima CTP5. Sto usando la decorazione per creare una mappa delle proprietà su una colonna PK. Ma come posso definire una PK su più di una colonna e, in particolare, come posso controllare l'ordine delle colonne nell'indice? È il risultato dell'ordine delle proprietà nella classe?

Grazie!

Risposte:


153

È possibile specificare l'ordine delle colonne negli attributi, ad esempio:

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
}

Se si utilizza il Findmetodo di a, DbSetè necessario tenere conto di questo ordine per i parametri chiave.


1
InvalidOperationException: il tipo di entità "XXX" ha una chiave primaria composta definita con annotazioni di dati. Per impostare la chiave primaria composita, utilizza l'API fluente.
Luca Ziegler

55

Per completare la risposta corretta inviata da Slauma, puoi utilizzare il metodo HasKey per specificare un ordine anche per le chiavi primarie composite:

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
Grazie - entrambi i metodi funzionano bene. Preferisco gli attributi perché sto generando le mie classi dal codice e gli attributi sono molto più concisi.
GilShalit

Personalmente aggiungo anche Propety (x ...). HasColumnOrder (0 ... n) a ciascuna delle proprietà con chiave. È buono, cattivo, indifferente?
Suamere

7

Se, come me, preferisci usare un file di configurazione puoi farlo in questo modo (basato sull'esempio di 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});
    }
}

Ovviamente devi aggiungere il file di configurazione al tuo contesto:

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

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

0

Usa come oggetto anonimo:

modelBuilder.Entity<UserExamAttemptQuestion>().ToTable("Users").HasKey(o => new { o.UserId, o.Username }); 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.