MVC EF一直在寻找昂贵的userId

时间:2014-02-07 03:32:22

标签: c# sql-server asp.net-mvc performance entity-framework

在我的代码中可能是一些错误的逻辑,但我在C#中首先拥有最新的MVC EF代码。当我查看sql profiler和昂贵的查询时,我注意到它正在获取这样的查询:

exec sp_executesql N'SELECT [UserId] FROM [Users] WHERE (UPPER([Email]) = @0)',
N'@0 nvarchar(71)',@0=N'myRegisteredEmail@someDomain.com'

这是因为我经常要求WebSecurity.CurrentUserId吗?我认为这需要一次,这一切都很好吗? (但我在一个页面中看到多个电话)。也许每个WebSecurity.CurrentUserId的请求也会导致系统从数据库中获取ID,并将Email作为识别用户的主要情况(我不希望这样)?

我有查询,其中一些外键是用户,但同样,Users表的主键是UserId,而不是电子邮件。为什么它会继续尝试通过电子邮件获取它?所以我也抓了那个想法。

因此,我无法追踪它会多次获取的原因。

最后,这些查询需要花费四分之一秒。添加几次,页面加载速度很慢。

2 个答案:

答案 0 :(得分:1)

根据您提供的内容,WebSecurity.CurrentUserId似乎每次都会调用数据库。为了最小化数据库调用,您应该将值存储到Session变量中。查看how safe is it to use session variables - asp.net / c#以查看之前关于会话安全性的讨论。

如果您的应用程序中的安全性最高,例如在银行Web应用程序中,您可以查看http://msdn.microsoft.com/en-us/library/ms178201(v=vs.90).aspx以使会话安全性更加强大。

答案 1 :(得分:1)

如果你有最新的MVC + EF,这是否意味着你也在使用最新的身份框架Microsoft.AspNet.Identity?

如果是这样,您可以像这样获得用户的ID:

User.Identity.GetUserId();

...其中User是你的Controller,HttpContext等的IPrincipal。我很确定你必须使用OWIN代替FormsAuthentication才能得到它。

每次都不会访问数据库,因为用户ID存储为声明; OWIN IPrincipals是ClaimsPrincipals。