ASP.NET标识 - 更改代码首先生成数据库字段长度以提高性能

时间:2017-02-12 18:09:46

标签: asp.net-mvc asp.net-mvc-5 asp.net-identity asp.net-identity-2

我正在使用ASP.NET MVC 5 Identity。我首先允许EF代码为我创建数据库表。 PasswordHash,SecurityStamp和PhoneNumber都是nvarchar(MAX) - 但是当我看他们的内容时,他们的内容要短得多。

对于我的主DAL,我使用的是Dapper - 虽然我让EF处理身份。

出于数据库性能的原因,我能够缩短这些MAX字段,同时保证身份仍能正常运行 - 如果是这样,那么长度是多少?

(我假设我可以用PhoneNumber做任何我喜欢的事情,因为我控制了该字段的内容 - 但我不太确定其他2)。

我找不到任何在线提及的内容。

2 个答案:

答案 0 :(得分:0)

我不确定它对性能有多大帮助,但您可以使用流畅的API配置您的Identity属性:

public class YourContext : IdentityDbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //Make you you do this BEFORE the code below
        base.OnModelCreating(modelBuilder);

        //Assuming your user class is called "User" here:
        modelBuilder.Entity<User>()
            .Property(e => e.PasswordHash).HasMaxLength(100);

    }
}

请注意,如果您使这些字段与Identity框架要插入的值不兼容,那么您将遇到问题。所以我建议最大长度的值很大。

答案 1 :(得分:0)

SQL Server的差异(我假设这是您使用的)性能给定nvarchar(x)vs nvarchar(Max)是在这些字段上进行搜索时。即select * from users where phoneNumber='123456789'

但是您提到的字段在标准身份模板的任何位置都不受where子句的约束。甚至不是SecurityStamp,绝对不是PasswordHash。通过电子邮件,用户名,ID搜索用户。而且这些已经有限了 - 256个字符(see source,滚动到OnModelCreating)。在UserName列上应用索引。

因此,您所谈论的任何性能原因都不存在。

如果您通过电子邮件进行大量查询,则可以在Email列上应用索引 - 这就像您可以获得性能一样多。电话号码也是如此 - 如果您通过电话号码查找用户,那么制作有限长度的列并应用索引是有意义的。