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.

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

}

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

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
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.