Comment faire de l'EF-Core utiliser un Guid au lieu de String pour ses ID de la clé Primaire
Quand je regarde le ASP.NET 3 Identité qu'il utilise un string
et pas un Guid
pour la clé primaire unique.
Dans mon Entity Framework
code first
Utilisateurs ApplicationUser
classe, j'hérite de l'Identité de classe
public class ApplicationUser : IdentityUser
{
}
qui entraîne quand j'ai créer mon Entité Cadre des migrations un tableau aspnetusers
se créé avec un type de clé denvarchar(450)
au lieu de uniqueidentifier
Quand je compare cela à ASP.NET Identity 2
ENtity Framework
projet, il a créé un champ ID de uniqueidentifier
et pas nvarchar(450)
J'imagine que pour les performances de la base de clés primaires et les clés étrangères des uniqueidentifier
serait mieux que nvarchar(450)
Est-il un moyen de les utiliser pour la clé unique Guid
au lieu de string
et uniqueidentifier
au lieu de nvarchar(450)
avec ASP.NET Identity 3
?
Il y a un question précédente comment convertir une Chaîne en un Guid, mais je veux que la table de base de données d'identité, un Guid.
J'ai trouvé un autre question ainsi pour une BÊTA précédente lorsque la longueur est de type nvarchar(128). La raison donnée est que pas toutes les bases de données de soutien Guid et il a été changé pour plus de flexibilité.
Est il doit y avoir un moyen facile de changer de chaîne pour Guid sans avoir à réécrire l'ensemble de la identity 3
?
nvarchar(450)
est vraiment exagéré et donne toutes sortes de mises en garde lors de la création de base de données SQL Server contraintes. Base de données des administrateurs ne sera définitivement pas comme ces avertissements.
OriginalL'auteur devfric | 2016-05-11
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin personnalisé
ApplicationUser
hériter deIdentityUser<TKey>
et personnalisé Rôle hériter deIdentityRole<TKey>
Personnalisé contexte de classe hérite de
IdentityDbContext<ApplicationUser, Role, TKey>
et utiliser couramment l'api pour générer automatiquement clés guid.puis dans Démarrage ajouter l'Identité de service de conteneur comme ça
Si vous n'avez pas créé la base de données, désactivez les migrations dossier et exécuter ef commandes
OriginalL'auteur
Je n'ai pas testé avec les migrations pour cet exemple encore (ils peuvent avoir besoin de quelques ajustements), cependant ASP.NET l'Identité v3 est beaucoup plus extensible que la v2 était à cet égard.
Ce qui suit devrait vous donner une Identité à un magasin basé sur le Guid de clés primaires pour les Utilisateurs et les Rôles de la même manière:
et de démarrage de la classe:
De même, si vous n'avez pas besoin d'ajouter des champs personnalisés à l'Identité de l'Utilisateur, ou de personnaliser vos options, vous pouvez simplement faire ce qui suit:
et dans votre démarrage:
OriginalL'auteur
ApplicationUser hérite de IdentityUser de la classe de base qui est définie comme ayant une chaîne comme id. Donc, pour vraiment utiliser un guid/uniqueidentifier vous besoin pour ne pas hériter de cette classe de base.
Note que, en interne c'est à l'aide de guid des chaînes pour les ids. Vous devriez au moins être en mesure de limiter la taille du champ de la clé comme indiqué ici:
Il est possible d'utiliser les Guid/uniqueidentifier pour la clé, mais qui nécessitera plus de travail, en plus de l'utilisation de votre propre classe de base (ou n'utilisez pas de classe de base) et d'utiliser un custom DbContext à la carte le modèle. D'emprunt et de modification de la EF code à partir d'ici devrait obtenir que vous allez, vous devez hériter de UserStore et de surcharger les méthodes virtuelles pour la recherche d'un utilisateur par id, parce que l'interface IUserStore définit la FindById signature de la méthode avec une chaîne. Donc primordiale que vous devez convertir la chaîne de caractères à un guid à l'intérieur de l'méthodes où vous avez besoin d'extraire ou de recherche par id.
Je suis en train de faire exactement ce que dans mon cloudscribe projet qui a une coutume multi-locataire de la mise en œuvre de l'Identité
EDIT: en fait en regardant de plus près le code de la IdentityUser a une version générique où vous pouvez définir le type de la clé
De sorte que vous pourriez être capable de définir votre propre classe de base comme
mais je pense que vous devez remplacer la UserStore des méthodes qui prennent une chaîne d'identification et de convertir la chaîne de caractères à un guid.
OriginalL'auteur