Zusammengesetzter Schlüssel mit EF 4.1-Code zuerst

105

Ich versuche herauszufinden, wie man einen zusammengesetzten Schlüssel mit EF-Code First 4.1 RC hat.

Derzeit verwende ich die Datenanmerkung [Schlüssel], kann jedoch nicht mehr als einen Schlüssel angeben.

Wie würde man einen zusammengesetzten Schlüssel angeben?

Hier ist mein Beispiel:

 public class ActivityType
{
    [Key]
    public int ActivityID { get; set; }

    [Required(ErrorMessage = "A ActivityName is required")]
    [StringLength(50, ErrorMessage = "Activity Name must not exceed 50 characters")]
    public string ActivityName { get; set; }

}

Ich brauche den "ActivityName", um auch ein Schlüssel zu sein. Sicher, ich kann das umgehen, aber das ist kein gutes Datenbankdesign.

Bugnuker
quelle

Antworten:

186

Sie können beide ActivityIDund ActivityNameEigenschaften mit KeyAnmerkungen markieren oder eine flüssige API verwenden, wie von @taylonr beschrieben.

Bearbeiten:

Dies sollte funktionieren - zusammengesetzter Schlüssel, der mit Anmerkungen definiert wurde, erfordert eine explizite Spaltenreihenfolge:

public class ActivityType
{
    [Key, Column(Order = 0)]
    public int ActivityID { get; set; }

    [Key, Column(Order = 1)]
    [Required(ErrorMessage = "A ActivityName is required")]
    [StringLength(50, ErrorMessage = "Activity Name must not exceed 50 characters")]
    public string ActivityName { get; set; }

}
Ladislav Mrnka
quelle
Aha. Danke, dass du mich aktualisiert hast. Als Antwort markiert.
Bugnuker
1
Wie auch immer, um eindeutige Einschränkungen / Indizes hinzuzufügen, die nicht wirklich Schlüssel sind?
Shimmy Weitzhandler
105

Wir verwenden keine Anmerkungen, sondern überschreiben den Modellbauer. In diesem Fall können Sie Folgendes tun:

modelBuilder.Entity<Activity>().HasKey(a => new { a.ActivityId, a.ActivityName });
taylonr
quelle
Das funktioniert, aber ich hoffe auf eine Anmerkung, die funktioniert. Es gab Proben mit CTP 4, aber diese funktionieren nicht mehr in 4.1 RC
Bugnuker
3
Ich weiß, dass Sie nach Anmerkungen gesucht haben, aber ich dachte, dies könnte bei der Suche hilfreich sein ... wie gesagt, wir verwenden keine Anmerkungen, daher habe ich dort nicht viel geholfen ... Ich hoffe, Sie finden die Antwort
taylonr
14
Ich mag diesen Ansatz. Hält das Modell frei von Kontextproblemen. Vielen Dank.
Ctorx
Weiß jemand, ob das Festlegen eines zusammengesetzten Primärschlüssels mithilfe einer fließenden API für SQL CE funktioniert? Es funktioniert bei mir nicht (gibt einen Fehler aus, dass 'EntityType ... keinen Schlüssel definiert hat') und ich bin nicht sicher, ob ich eine neue Frage erstellen soll oder nicht.
Kasitan
Wenn Sie Ihren DbContext zu Unit-Testzwecken verspotten, wie stellen Sie sicher, dass der modelBuilder ausgeführt wird, um die Beziehung zwischen Entitäten und / oder zusammengesetzten Primärschlüsseln zu definieren?
Jim Aho