我有一个使用mysql作为会员的asp.net网站。web应用程序工作得很好,当我连接到mysql托管在windows操作系统,但抛出一个错误,由于表名(大小写敏感)在Linux上。
这个错误与我的表无关,但是当调用验证用户时,它与内部MySQL适配器类有关。
错误如下:
表' dbname。AspNetUsers不存在
描述:当前web请求执行过程中出现未处理的异常。请查看堆栈跟踪以获得有关错误及其在代码中的起源位置的更多信息。
异常详细信息:MySql.Data.MySqlClient.MySqlException: Table 'dbname. sql 'AspNetUsers不存在
给定,我有aspnetusers表在我的数据库中的小写字母。只有当我将主机从windows上的mySQL更改为Linux时,才会出现错误。
下面是抛出异常的代码行:public static ApplicationSignInManager Create(IdentityFactoryOptions<ApplicationSignInManager> options, IOwinContext context)
{
return new ApplicationSignInManager(context.GetUserManager<ApplicationUserManager>(), context.Authentication);
}
还请注意,我没有任何成员表在asp.net web应用程序,因为我使用的配置(成员资格,角色提供者)连接和认证用户。
我发现您可以通过重写IdentityModels.cs中的OnModelCreation方法来重新映射asp.net中的身份和成员资格提供程序的表名。
解决方案如下:
protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<ApplicationUser>().ToTable("aspnetusers");
modelBuilder.Entity<IdentityRole>().ToTable("aspnetroles");
modelBuilder.Entity<IdentityUserRole>().ToTable("aspnetuserroles");
modelBuilder.Entity<IdentityUserClaim>().ToTable("aspnetuserclaims");
modelBuilder.Entity<IdentityUserLogin>().ToTable("aspnetuserlogins");
}
你注意到,显式设置所有标准asp.net成员表名称为小写,因为我有它在我的数据库,这是导致问题。
现在我可以连接,认证和管理会员从我现有的web应用程序连接到基于Linux的MySQL数据库。
对所有表遵循动态解决方案
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
foreach (var entity in builder.Model.GetEntityTypes()) {
entity.Relational().TableName = entity.Relational().TableName.ToLower();
}
}