Quel est le but de la ConcurrencyStamp colonne dans la AspNetUsers table dans la nouvelle ASP.NET MVC 6 de l'identité?
Quel est le but de la ConcurrencyStamp
colonne dans la AspNetUsers
table dans la nouvelle ASP.NET MVC 6 identité?
C'est le schéma de base de données de la AspNetUsers
table:
C'est également là dans le AspNetRoles
table:
Que je me souviens qu'il n'était pas là dans le ASP.NET MVC 5 de l'identité.
Ce que j'ai remarqué jusqu'à présent, c'est qu'il semble avoir des valeurs GUID tel qu'il est défini par le code suivant:
///<summary>
///A random value that must change whenever a user is persisted to the store
///</summary>
public virtual string ConcurrencyStamp { get; set; } = Guid.NewGuid().ToString();
Mais cette documentation n'est pas suffisant pour moi de comprendre dans quelles situations il est utilisé.
- Je suppose (n'avez pas utilisé le v6 encore), qui comme son nom l'indique, il est utilisé pour traiter le simultanées
updates
à unuser
. J'ai ajouter manuellement quelque chose de semblable (par exemple,rowversion
/timestamp
) accomplir même. Hth... - Je commence à chose que ce soit pour de ASP.NET la mise en cache.
- Ce que je veux savoir, c'est pourquoi ils l'ont mis à
nvarchar(MAX)
si ça va être n'est plus qu'un GUID - croix plate-forme/base de données que je suis dans le doute. De Plus, vous pouvez stocker dans un endroit qui n'est même pas une base de données SQL.
Vous devez vous connecter pour publier un commentaire.
Que le nom de l'état, il est utilisé pour prévenir la simultanéité conflit de mise à jour.
Par exemple, il y a une UserA nommé Peter dans la base de données
2 admins ouvrez l'éditeur de page de l'Utilisateur, souhaitez mettre à jour cet utilisateur.
Qu'arriverait-il si il n'y a pas ConcurrencyStamp est Admin_1 de la mise à jour sera remplacé par Admin_2 de mise à jour.
Mais depuis que nous avons ConcurrencyStamp, quand Admin_1/Admin_2 charge la page, le timbre est chargé. Lors de la mise à jour des données de ce timbre sera changé aussi.
Alors maintenant, l'étape 5 de système de jeter l'exception dire Admin_2 que cet utilisateur a déjà été mis à jour, car il ConcurrencyStamp est différent de celui qu'il est chargé.
À partir du code source lui-même
Fondamentalement, la voir telle qu'elle est nommée. Un timbre qui est utilisé pour identifier la version actuelle des données. Si vous de le changer, pour le timbre.
Donc, si deux mises à jour simultanées dans le même temps, ils doivent avoir le même timbre ou l'un d'eux doit être jeté.
D'où le nom,
ConcurrencyStamp
.Pour le suivi de Maxime réponse:
Si vous regardez à la mise en œuvre de IdentityDbContext dans le OnModelCreating() la méthode, vous trouverez:
et dans le UserStore.UpdateAsync(...)-méthode:
Donc, en effet, il en fait ce qu'il est censé faire: empêcher les mises à jour simultanées sur un objet utilisateur. Le jeton est simplement utilisé le "sous le capot" dans l'ASP Identité EntityFramework module. En gros, si une mise à jour simultanée d'un objet utilisateur se produit, la DB contexte jette DbUpdateConcurrencyException.
Également important de réaliser que c'est en fait un EF de fonctionnalités de Base, le schéma de l'Identité définit simplement la colonne à être utilisé comme une simultanéité de la colonne, mais n'est pas en fin de compte, ou à un usage interne.
Il n'y a pas de logique de comparaison de passe à l'intérieur de Identité de la base de code - c'est seulement quand EFCore va en fait pour la sauver qu'il coups de pied dans.
https://docs.microsoft.com/en-us/ef/core/modeling/concurrency
EF Premier Code IsConcurrencyToken()