Clé composite avec code EF 4.1 en premier

105

J'essaie de comprendre comment avoir une clé composite en utilisant le code EF First 4.1 RC.

Actuellement, j'utilise l'annotation de données [Clé], mais je ne peux pas spécifier plus d'une clé.

comment spécifier une clé composite?

Voici mon exemple:

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

}

J'ai besoin que "ActivityName" soit également une clé. Bien sûr, je peux coder autour de cela, mais ce n'est pas une bonne conception de base de données.

bugnuker
la source

Réponses:

186

Vous pouvez marquer les propriétés ActivityIDet les ActivityNamepropriétés avec une Keyannotation ou vous pouvez utiliser une API fluide comme décrit par @taylonr.

Éditer:

Cela devrait fonctionner - la clé composite définie avec des annotations nécessite un ordre de colonne explicite:

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
la source
Je vois. Merci de m'avoir mis à jour. Marqué comme réponse.
bugnuker
1
Quoi qu'il en soit pour ajouter des contraintes / index uniques qui ne sont pas vraiment des clés?
Shimmy Weitzhandler
105

Nous n'utilisons pas les annotations, à la place nous remplaçons le générateur de modèle, auquel cas vous pouvez faire quelque chose comme:

modelBuilder.Entity<Activity>().HasKey(a => new { a.ActivityId, a.ActivityName });
taylonr
la source
cela fonctionne, mais j'espère une annotation qui fonctionne. Il y avait des échantillons avec CTP 4 mais ceux-ci ne fonctionnent plus dans 4.1 RC
bugnuker
3
Je sais que vous cherchiez des annotations, mais j'ai pensé que cela pourrait aider dans la recherche ... comme je l'ai dit, nous n'utilisons pas d'annotations, donc je n'ai pas beaucoup aidé là-bas ... j'espère que vous trouverez la réponse
taylonr
14
J'aime cette approche. Garde le modèle propre des préoccupations liées au contexte. THX.
ctorx
Quelqu'un sait-il si la définition de la clé primaire composite à l'aide d'une API fluide fonctionne pour SQL CE? Cela ne fonctionne pas pour moi (donne une erreur indiquant que «EntityType ... n'a pas de clé définie») et je ne suis pas sûr de créer une nouvelle question ou non.
kasitan le
Si vous vous moquez de votre DbContext à des fins de test unitaire, comment vous assurer que le modelBuilder est exécuté afin de définir la relation entre les entités et / ou les clés primaires composites?
Jim Aho