我想更改ASP.NET Identity 2.0使用的表的名称。我见过各种类似的问题,但没有什么能解决我的问题。例如,这种类型的解决方案:
http://www.goatly.net/customizing-table-names-for-identitydbcontextwithcustomuser-data-contexts
似乎取决于Code First(?)。无论如何,实现OnModelCreating对我无济于事。我基本上已经将AspNetUsers和类似的表重命名为我自己的名称,并希望能够使用它们。我有一个要使用的现有EF上下文(MyContext),因此我对其进行了修改以从IdentityDbContext派生(编辑t4模板),然后在Startup.Auth中具有:

        UserManagerFactory = () =>
        {
            var context = new MyContext();

            Database.SetInitializer<MyContext>(new IdentityDbInitializer());

            var userStore = new UserStore<IdentityUser>(context){
                DisposeContext = true
            };

            return new UserManager<IdentityUser>(userStore);
        };

但是,当我尝试登录时会出现“无法联系服务器”的问题。我想那是因为我的UserStore无法知道上下文中的哪些User表。我希望这是OnModelCreating代码会做的事情,但是我对此感到迷惑。我想UserStore仍在寻找“AspNetUsers”表,尽管我不知道这些名称从何而来。对于上下文修改t4模板,我也感到不安-这是我应该从IdentityDbContext派生的方式吗?

任何帮助,不胜感激。

最佳答案

遵循的几个步骤:

  • 安装NuGet软件包:Microsoft.AspNet.Identity.EntityFramework
  • connection string添加到您的web.config/app.config

  • 现在,您必须定义自定义的Database Context:
    public class MyContext : IdentityDbContext
    {
        public MyContext()
            : base(<connection string name>)
        {
    
        }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
    
            modelBuilder.Entity<IdentityUser>()
                .ToTable("Users");
    
            modelBuilder.Entity<IdentityRole>()
                .ToTable("Roles");
    
            modelBuilder.Entity<IdentityUserRole>()
                .ToTable("UserRoles");
    
            modelBuilder.Entity<IdentityUserClaim>()
                .ToTable("UserClaims");
    
            modelBuilder.Entity<IdentityUserLogin>()
                .ToTable("UserLogins");
        }
    }
    

    如您所见,我已经使用DbModelBuilder将所有实体映射到新表。
  • 打开NuGet软件包管理器控制台
  • 执行命令Enable-Migrations

  • 它将使用配置文件Migrations创建一个文件夹Configuration.cs

    它看起来应该像这样:
    internal sealed class Configuration : DbMigrationsConfiguration<ConsoleApplication1.Models.MyContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
        }
    
        protected override void Seed(ConsoleApplication1.Models.MyContext context)
        {
    
        }
    }
    

    在构造函数中,将属性AutomaticMigrationsEnabled更改为true
  • 打开NuGet软件包管理器控制台
  • 执行命令Update-Database

  • 它应该运行脚本来创建新表。

    您可以自定义实体(和ID),为定义的每个接口(interface)创建自定义类。
    public class MyUser : IdentityUser<string, MyUserLogin, MyUserRole, MyUserClaim>
    {
    }
    

    由于您使用的是Owin,因此可以定义您的UserStore:
    public class MyUserStore: UserStore<MyUser, MyRole, string, MyUserLogin, MyUserRole, MyUserClaim>
    {
        public MyUserStore(MyContext context)
            : base(context)
        {
        }
    }
    

    和您的UserManager实现:
    public class ApplicationUserManager : UserManager<ASPNETIdentity2.Models.MyUser, string>
    {
        public ApplicationUserManager(IUserStore<ASPNETIdentity2.Models.MyUser, string> store)
            : base(store)
        {
    
        }
    
        public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
        {
            var manager = new ApplicationUserManager(new MyUserStore(context.Get<MyContext>()));
    
            manager.UserValidator = new UserValidator<MyUser, string>(manager)
            {
                AllowOnlyAlphanumericUserNames = false,
                RequireUniqueEmail = true
            };
    
            manager.PasswordValidator = new PasswordValidator()
            {
                RequiredLength = 5,
                RequireNonLetterOrDigit = false,     // true
                // RequireDigit = true,
                RequireLowercase = false,
                RequireUppercase = false,
            };
    
            return (manager);
        }
    }
    

    而且您的Owin.Startup应该看起来像这样:
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.CreatePerOwinContext(MyContext.Create);
            app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
        }
    }
    

    如果要查看自定义实现,可以在ASP.NET MVC上使用简单的工作解决方案来检查我的GitHub repository

    更新:

    该解决方案中还有另一个项目需要最少的设置。基本上,如果您只想重命名表,则只需要定义上下文( IdentityDbContext )。

    该项目可以在here中找到。

    10-01 16:38