web-dev-qa-db-fra.com

Comment utiliser la propriété String comme clé primaire dans Entity Framework

Je suis nouveau dans EF et j'essaie de faire mes premiers pas par la première approche de code dans ETF6.0 et maintenant j'ai un problème.

J'ai une propriété

[Key]
public string FooId { get; set; }

qui est ma clé primaire pour le modèle.

Mais si je lance le

PM> Update-Database

commande dans la console du gestionnaire de packages pour mettre à jour les migrations en attente vers la base de données, j'obtiens l'erreur suivante:

La colonne d'identité 'FooId' doit être de type de données int, bigint, smallint, tinyint, ou décimal ou numérique avec une échelle de 0, et contrainte d'être non nullable.

Si je change le PK de mon modèle en

[Key]
public int FooId { get; set; } 

tout fonctionne bien.

Mais j'aurais besoin que le PK soit de type chaîne car il est absolument sensé dans mon cas. Je sais qu'il y a des inconvénients mais pour moi c'est nécessaire.

J'ai vu un post plus ancien ici Comment faire de la chaîne comme clé primaire dans le framework d'entité! .

Mais cela ne semble pas résoudre mon problème ou je ne le comprends tout simplement pas.

Est-ce vraiment que je ne peux pas utiliser une chaîne comme PK sur une base de données SQL?

Ou existe-t-il un moyen de le faire?

20
ck84vi

C'est la bonne façon de créer un PK sans incrémentation automatique d'identité activée:

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public string FooId { get; set; }
39

Si vous avez besoin que votre clé primaire soit une chaîne, n'en faites pas une colonne d'identité. Les colonnes d'identité généreront pour vous des valeurs de clé primaire, que vous devez désactiver si vous avez l'intention de générer les valeurs vous-même.

2
Bill Ravdin

Quelle est votre raison d'avoir une chaîne comme clé primaire?

Je voudrais simplement définir la clé primaire sur un champ entier à incrémentation automatique et mettre un index sur le champ de chaîne.

De cette façon, si vous effectuez des recherches sur la table, elles devraient être relativement rapides, et toutes vos jointures et vos recherches normales ne seront pas affectées par leur vitesse.

Vous pouvez également contrôler la quantité du champ de chaîne qui est indexé. En d'autres termes, vous pouvez dire "indexer uniquement les 5 premiers caractères" si vous pensez que cela suffira. Ou si vos données peuvent être relativement similaires, vous pouvez indexer tout le champ.

1
Rakin