MVC EF search toujours userId, ce qui est coûteux

Peut-être que c'est une logique défectueuse dans mon code, mais j'ai le plus récent code EF MVC en C #. Comme je regardais le profileur sql et les requêtes coûteuses, je suis venu à remarquer qu'il récupère une requête comme celle-ci:

exec sp_executesql N'SELECT [UserId] FROM [Users] WHERE (UPPER([Email]) = @0)', N'@0 nvarchar(71)',@0=N'[email protected]' 

Est-ce que cela est causé par mes fréquentes requests de WebSecurity.CurrentUserId ? Je pensais que ça prend une fois et tout va bien? (mais je vois plusieurs appels dans une page). Peut-être que chaque requête WebSecurity.CurrentUserId à WebSecurity.CurrentUserId le système à récupérer l'ID de la database, en conservant le Email comme principal cas d'identification de l'user (ce que je préférerais que ce ne soit pas le cas)?

J'ai des requêtes où certaines foreign keys sont des users, mais encore une fois, la key primaire de la table des Users est UserId , pas email. Pourquoi continuerait-il à essayer de le récupérer via l'Email? J'ai donc gratté cette pensée aussi.

Ainsi je suis incapable de find la raison pour laquelle il irait chercher plusieurs fois.

Et enfin, ces requêtes prennent jusqu'à un quart de seconde. Ajoutez-le plusieurs fois et la page se charge assez lentement.

Si vous avez le dernier MVC + EF, cela signifie-t-il que vous utilisez également le nouveau framework d'identité Microsoft.AspNet.Identity?

Si c'est le cas, vous pouvez get l'identifiant de votre user comme ceci:

 User.Identity.GetUserId(); 

… où User est l'IPrincipal sur votre controller, HttpContext, etc. Je suis sûr que vous devez utiliser OWIN à la place de FormsAuthentication afin d'get ceci.

Cela ne frappe pas la database à chaque fois parce que l'identifiant de l'user est stocké comme une réclamation; IPrincipaux OWIN sont ClaimsPrincipals.

En fonction de ce que vous avez donné, il semble que WebSecurity.CurrentUserId appelle la database à chaque fois. Afin de minimiser les appels de database, vous devez stocker la valeur dans une variable de session. Vérifiez à quel point il est sûr d'utiliser les variables de session – asp.net / c # pour voir les discussions précédentes sur la security d'une session.

Si la security est primordiale dans votre application, comme dans une application web bancaire, vous pouvez jeter un oeil à http://msdn.microsoft.com/en-us/library/ms178201(v=vs.90).aspx pour faire Sécurité de session encore plus robuste.