如何在代码第一种方法中修改现有的IdentityUser列大小

时间:2016-04-27 16:25:57

标签: sql-server asp.net-identity

我使用代码第一种方法。我们总是不喜欢在表格中添加NVarchar(max)。但是当我们默认使用身份帐户管理时,AspNetUser表中的列包含NVarchar(max),如下图所示。 我的团队认为varchar(Max)会降低性能。

在数据库中

enter image description here

代码

enter image description here

现在我的问题是

1)那个列中是否需要varchar(max)?

2)我们可以减少该列的大小吗?

3)如果是,如何减少列大小?

4)当拥有Varchar(Max)时,这真的会产生这样的性能问题吗? (我知道为什么我们不应该使用它,但指导我,这是一个如此大的问题)

许多文章仅解释了如何在该表中包含新列,而不是修改现有列。请帮助我。

抱歉,如果您不理解我的问题,请问我。

1 个答案:

答案 0 :(得分:3)

您可以使用fluent配置设置长度:

public class ApplicationUser : IdentityUser
{
    ...

    public class Mapping : EntityTypeConfiguration<ApplicationUser>
    {
        Property(m => m.PasswordHash).HasMaxLength(50)
        Property(m => m.SecurityStamp).HasMaxLength(50)
        Property(m => m.PhoneNumber).HasMaxLength(50)
    }
}

然后,在你的背景下:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    ...

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new ApplicationUser.Mapping());
    }
}

对于要使用的确切列长度,您可能需要进行一些测试。我不认为PasswordHashSecurityStamp值本身具有固定长度,因此您需要发现一些向上限制。 PhoneNumber非常直截了当,但如果您正在与国际用户打交道,请记住它在美国只有10位数。其他国家/地区使用各种不同的电话号码格式和长度。

尽管如此,这主要是浪费时间,精力和精力。虽然利用MAX与定义的长度相比会产生理论上的性能影响,但影响可以忽略不计,并且在实践中不会引人注意或甚至无法衡量。使用MAX的唯一真正缺点是您无法在该列上应用索引。但是,这只有在您打算按该列进行查询时才有意义,这对于您关注的三列非常不可能。身份始终会按用户名,用户名或电子邮件查找用户,而不是PasswordHashSecurityStamp,以及您通过电话号码查看用户的频率是多少?

长短,你在这里真正做的就是为自己引入潜在的维护问题。您今后需要密切关注这些列,并确保不仅仅是您选择了一个好的长度,而且未来版本的Identity也不会进行一些影响长度的修改。