9

我想更改 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 派生的方式吗?

非常感谢任何帮助。

4

2 回答 2

21

要遵循的几个步骤:

  • 安装 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)
    {

    }
}

在构造函数中将属性更改AutomaticMigrationsEnabledtrue.

  • 打开 NuGet 包管理器控制台
  • 执行命令Update-Database

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

您可以自定义您的实体(和 Id),为定义的每个接口创建自定义类。

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 存储库。

更新:

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

该项目可以在这里找到。

于 2014-07-15T17:08:18.040 回答
0

带有实体框架的身份 2 假定代码优先。这个项目似乎做我需要的: https ://github.com/cbfrank/AspNet.Identity.EntityFramework

于 2014-07-18T03:36:49.603 回答