use*_*921 7 mysql entity-framework ef-code-first entity-framework-6 asp.net-identity
如何限制表AspNetUsers中的UserNameIndex UNIQUE索引?
我正在使用带有Mysql后端的ASP.NET身份,并且正在运行另一个实例:
Index column size too large. The maximum column size is 767 bytes.
Run Code Online (Sandbox Code Playgroud)
我试过了
modelBuilder.Entity<Secuser>().Property(x => x.UserName).HasMaxLength(100);
modelBuilder.Entity<Secuser>().Property(t => t.Id).HasMaxLength(100);
Run Code Online (Sandbox Code Playgroud)
我已经完成了所有标准:
public class Secuser : IdentityUser
{
[Required]
public string FullName { get; set; }
[Required]
public string Address { get; set; }
[Required]
public string City { get; set; }
[Required]
public string Country { get; set; }
[Required]
public bool AgreeTermsOfServicePrivacyPolicy { get; set; }
[Required]
public string BasePath { get; set; }
}
[DbConfigurationType(typeof(MySqlEFConfiguration))]
public class ApplicationDbContext : IdentityDbContext<Secuser>
{
public ApplicationDbContext() : base("DefaultConnection")
{
}
.....
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Secuser>().Property(x => x.UserName).HasMaxLength(100);
modelBuilder.Entity<Secuser>().Property(t => t.Id).HasMaxLength(100);
.....
base.OnModelCreating(modelBuilder);
}
}
Run Code Online (Sandbox Code Playgroud)
当我发出:
update-database -verbose
Run Code Online (Sandbox Code Playgroud)
输出是:
Using StartUp project 'sec'.
Using NuGet project 'sec'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'sec' (DataSource: localhost, Provider: MySql.Data.MySqlClient, Origin: Configuration).
Applying explicit migrations: [201405072209015_InitialCreate].
Applying explicit migration: 201405072209015_InitialCreate.
.....
create table `AspNetUsers` (`Id` nvarchar(128) not null ,`FullName` longtext not null ,`Address` longtext not null ,`City` longtext not null ,`Country` longtext not null ,`AgreeTermsOfServicePrivacyPolicy` bool not null ,`BasePath` longtext not null ,`Email` nvarchar(256) ,`EmailConfirmed` bool not null ,`PasswordHash` longtext,`SecurityStamp` longtext,`PhoneNumber` longtext,`PhoneNumberConfirmed` bool not null ,`TwoFactorEnabled` bool not null ,`LockoutEndDateUtc` datetime,`LockoutEnabled` bool not null ,`AccessFailedCount` int not null ,`UserName` nvarchar(256) not null ,primary key ( `Id`) ) engine=InnoDb auto_increment=0
CREATE UNIQUE index `UserNameIndex` on `AspNetUsers` (`UserName` DESC) using HASH
MySql.Data.MySqlClient.MySqlException (0x80004005): Index column size too large. The maximum column size is 767 bytes.
at MySql.Data.MySqlClient.MySqlStream.ReadPacket()
at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId)
.....
Run Code Online (Sandbox Code Playgroud)
我还进行了更改以允许迁移历史记录工作:
public class MySqlHistoryContext : HistoryContext
{
public MySqlHistoryContext(DbConnection connection, string defaultSchema):base(connection,defaultSchema)
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<HistoryRow>().Property(h => h.MigrationId).HasMaxLength(100).IsRequired();
modelBuilder.Entity<HistoryRow>().Property(h => h.ContextKey).HasMaxLength(200).IsRequired();
}
}
Run Code Online (Sandbox Code Playgroud)
似乎整个问题都围绕着
`UserName` nvarchar(256)
modelBuilder.Entity<Secuser>().Property(x => x.UserName).HasMaxLength(100);
Run Code Online (Sandbox Code Playgroud)
似乎不起作用.我正在使用EntityFramework 6.1.0和Microsoft.AspNet.Identity.Core 2.0.1.
所以,看起来似乎:
要么我错过了我实施HasMaxLength的方法,要么就是为什么它不起作用.
简单地说,如果您查看日志(不那么明显),它会在此查询上崩溃:
CREATE UNIQUE index `UserNameIndex` on `AspNetUsers` (`UserName` DESC) using HASH
Run Code Online (Sandbox Code Playgroud)
当您查看迁移代码时,up() 函数,默认情况下您将看到:
UserName = c.String(nullable: false, maxLength: 256, storeType: "nvarchar"),
Run Code Online (Sandbox Code Playgroud)
我刚刚将 maxLength 值更改为 196 它应该可以工作。您只需记住用户名不能超过 196 个字符(我认为这对于 99.9% 的人来说确实足够了)
PS:我对“AspNetRoles”表遇到了同样的错误
| 归档时间: |
|
| 查看次数: |
1169 次 |
| 最近记录: |