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!

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.


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

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

0

Verwendung als anonymes Objekt:

modelBuilder.Entity<UserExamAttemptQuestion>().ToTable("Users").HasKey(o => new { o.UserId, o.Username }); 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.