im Entity Framework Code zuerst, wie KeyAttribute für mehrere Spalten verwendet wird

93

Ich erstelle ein POCO-Modell, das zuerst mit dem Entity-Framework-Code CTP5 verwendet werden soll. Ich verwende die Dekoration, um eine Eigenschaftszuordnung zu einer PK-Spalte zu erstellen. Aber wie kann ich eine PK für mehr als eine Spalte definieren und insbesondere wie kann ich die Reihenfolge der Spalten im Index steuern? Ist es ein Ergebnis der Reihenfolge der Eigenschaften in der Klasse?

Vielen Dank!

GilShalit
quelle

Antworten:

153

Sie können die Spaltenreihenfolge in den Attributen angeben, zum Beispiel:

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
}

Wenn Sie die FindMethode a verwenden DbSet, müssen Sie diese Reihenfolge für die Schlüsselparameter berücksichtigen.

Slauma
quelle
1
InvalidOperationException: Für den Entitätstyp 'XXX' ist ein zusammengesetzter Primärschlüssel mit Datenanmerkungen definiert. Verwenden Sie eine flüssige API, um den zusammengesetzten Primärschlüssel festzulegen.
Luca Ziegler
55

Um die von Slauma übermittelte richtige Antwort zu vervollständigen, können Sie mit der HasKey- Methode auch eine Reihenfolge für zusammengesetzte Primärschlüssel angeben:

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 
        });
    }
}
Morteza Manavi
quelle
2
Danke - beide Methoden funktionieren gut. Ich bevorzuge die Attribute, weil ich meine Klassen aus Code generiere und die Attribute viel prägnanter sind.
GilShalit
Ich persönlich füge auch die Eigenschaft Propety (x ...). HasColumnOrder (0 ... n) zu jeder der Schlüsseleigenschaften hinzu. Ist das gut, schlecht, gleichgültig?
Suamere
7

Wenn Sie wie ich eine Konfigurationsdatei bevorzugen, können Sie dies auf folgende Weise tun (basierend auf Manavis Beispiel):

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

Natürlich müssen Sie die Konfigurationsdatei zu Ihrem Kontext hinzufügen:

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

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

Verwendung als anonymes Objekt:

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