简体   繁体   English

ASP.Net 标识 - 使用自定义架构

[英]ASP.Net Identity - Use custom Schema

I am using MVC5 + Ef6 code first with ASP.Net Identity 1.0 and wish to have the tables created in a custom schema.我首先将 MVC5 + Ef6 代码与 ASP.Net Identity 1.0 一起使用,并希望在自定义架构中创建表。 ie a schema that is not the dbo schema.即不是 dbo 模式的模式。

I reversed engineered my databse using the Ef power tools and set the schema name for all other tables in the mapping class to the following我使用 Ef 电源工具对我的数据库进行了逆向工程,并将映射类中所有其他表的模式名称设置为以下内容

this.ToTable("tableName", "schemaName");

I tried doing this for the ASP.Net tables but it kept giving me a lots of errors and eventually I gave up.我尝试为 ASP.Net 表执行此操作,但它不断给我带来很多错误,最终我放弃了。 If I exclude the (reverse engineered) ASP.Net Identity tables from my project they will be created but always in the dbo schema如果我从我的项目中排除(逆向工程)ASP.Net Identity 表,它们将被创建,但总是在 dbo 模式中

Anyone know how to do this?有人知道怎么做吗?

public class MyDbContext : EntityDbContext<ApplicationUser>
{
    public DbSet<ApplicationUser> Users { get; set; }

    public MyDbContext() : base()
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        // You can globally assign schema here
        modelBuilder.HasDefaultSchema("schemaName");
    }
}

Here is a late entry explaining what I did.这是一个解释我做了什么的迟到条目。 Not sure if there is a better way, but this is the ONLY thing that worked for me.不确定是否有更好的方法,但这是唯一对我有用的方法。

To be fair, I have more than a single model in my context.公平地说,在我的上下文中,我有不止一个模型。 Which is why this was better for me.这就是为什么这对我更好。

  1. Generate the tables in a database ahead of time (while tables are still in 'dbo')提前在数据库中生成表(而表仍在“dbo”中)
  2. Execute add-migration on your project and let it create a migration在你的项目上执行add-migration并让它创建一个迁移
  3. Change all the schemas within your migration code to the desired schema将迁移代码中的所有架构更改为所需的架构
  4. Execute update-database to get those changes updated执行update-database以更新这些更改
  5. Delete your original migration file (its' hash is useless to you)删除你的原始迁移文件(它的哈希对你没用)
  6. Execute add-migration again and let it create a new migration再次执行add-migration并让它创建一个新的迁移
  7. Update the OnModelCreating method of your configuration with the code below使用以下代码更新您的配置的OnModelCreating方法
  8. Run your application and start registering users运行您的应用程序并开始注册用户

NOTE:笔记:
You DO NOT want this.你不想要这个。

// This globally assigned a new schema for me (for ALL models)
modelBuilder.HasDefaultSchema("security");

CONFIGURATION: OnModelCreating配置:OnModelCreating
This assigned a new schema for ONLY the mentioned tables这仅为提到的表分配了一个新模式

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<ApplicationUser>().ToTable("AspNetUsers", "security");
    modelBuilder.Entity<CustomRole>().ToTable("AspNetRoles", "security");
    modelBuilder.Entity<CustomUserClaim>().ToTable("AspNetUserClaims", "security");
    modelBuilder.Entity<CustomUserLogin>().ToTable("AspNetUserLogins", "security");
    modelBuilder.Entity<CustomUserRole>().ToTable("AspNetUserRoles", "security");
}

INITIAL MIGRATION LOOKS LIKE初始迁移看起来像

public partial class Initial : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "security.AspNetRoles",
            c => new
                {
                    Id = c.String(nullable: false, maxLength: 128),
                    Name = c.String(nullable: false, maxLength: 256),
                })
            .PrimaryKey(t => t.Id)
            .Index(t => t.Name, unique: true, name: "RoleNameIndex");

        CreateTable(
            "security.AspNetUserRoles",
            c => new
                {
                    UserId = c.String(nullable: false, maxLength: 128),
                    RoleId = c.String(nullable: false, maxLength: 128),
                })
            .PrimaryKey(t => new { t.UserId, t.RoleId })
            .ForeignKey("security.AspNetRoles", t => t.RoleId, cascadeDelete: true)
            .ForeignKey("security.AspNetUsers", t => t.UserId, cascadeDelete: true)
            .Index(t => t.UserId)
            .Index(t => t.RoleId);

        CreateTable(
            "security.AspNetUsers",
            c => new
                {
                    Id = c.String(nullable: false, maxLength: 128),
                    FirstName = c.String(nullable: false, maxLength: 250),
                    LastName = c.String(nullable: false, maxLength: 250),
                    Email = c.String(maxLength: 256),
                    EmailConfirmed = c.Boolean(nullable: false),
                    PasswordHash = c.String(),
                    SecurityStamp = c.String(),
                    PhoneNumber = c.String(),
                    PhoneNumberConfirmed = c.Boolean(nullable: false),
                    TwoFactorEnabled = c.Boolean(nullable: false),
                    LockoutEndDateUtc = c.DateTime(),
                    LockoutEnabled = c.Boolean(nullable: false),
                    AccessFailedCount = c.Int(nullable: false),
                    UserName = c.String(nullable: false, maxLength: 256),
                })
            .PrimaryKey(t => t.Id)
            .Index(t => t.UserName, unique: true, name: "UserNameIndex");

        CreateTable(
            "security.AspNetUserClaims",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    UserId = c.String(nullable: false, maxLength: 128),
                    ClaimType = c.String(),
                    ClaimValue = c.String(),
                })
            .PrimaryKey(t => t.Id)
            .ForeignKey("security.AspNetUsers", t => t.UserId, cascadeDelete: true)
            .Index(t => t.UserId);

        CreateTable(
            "security.AspNetUserLogins",
            c => new
                {
                    LoginProvider = c.String(nullable: false, maxLength: 128),
                    ProviderKey = c.String(nullable: false, maxLength: 128),
                    UserId = c.String(nullable: false, maxLength: 128),
                })
            .PrimaryKey(t => new { t.LoginProvider, t.ProviderKey, t.UserId })
            .ForeignKey("security.AspNetUsers", t => t.UserId, cascadeDelete: true)
            .Index(t => t.UserId);

    }

    public override void Down()
    {
        DropForeignKey("security.AspNetUserRoles", "UserId", "security.AspNetUsers");
        DropForeignKey("security.AspNetUserLogins", "UserId", "security.AspNetUsers");
        DropForeignKey("security.AspNetUserClaims", "UserId", "security.AspNetUsers");
        DropForeignKey("security.AspNetUserRoles", "RoleId", "security.AspNetRoles");
        DropIndex("security.AspNetUserLogins", new[] { "UserId" });
        DropIndex("security.AspNetUserClaims", new[] { "UserId" });
        DropIndex("security.AspNetUsers", "UserNameIndex");
        DropIndex("security.AspNetUserRoles", new[] { "RoleId" });
        DropIndex("security.AspNetUserRoles", new[] { "UserId" });
        DropIndex("security.AspNetRoles", "RoleNameIndex");
        DropTable("security.AspNetUserLogins");
        DropTable("security.AspNetUserClaims");
        DropTable("security.AspNetUsers");
        DropTable("security.AspNetUserRoles");
        DropTable("security.AspNetRoles");
    }
}

Sorry my english, i use google translator.对不起,我的英语,我使用谷歌翻译。

Some steps indicated by Prisioner ZERO are not necessary.零号囚徒指示的某些步骤不是必需的。 The indications provided are based on the standard template with individual user accounts security .提供的指示基于具有个人用户帐户安全性的标准模板

First we must verify that our project is clean (insert commands in Package Management Console):首先,我们必须验证我们的项目是否干净(在包管理控制台中插入命令):

  1. If you already have a database created with the default ASP.NET Identity schema, you have to delete the database with the following command (or delete directly in SQL Server) :如果您已经使用默认 ASP.NET Identity 架构创建了一个数据库,则必须使用以下命令删除该数据库(或直接在 SQL Server 中删除):

Drop-Database

  1. If you have the default migration of the ASP.NET Identity template, execute the following command to remove it:如果您有 ASP.NET Identity 模板的默认迁移,请执行以下命令将其删除:

Remove-Migration

Now that our project is clean, we must modify the ApplicationDbContext class.现在我们的项目是干净的,我们必须修改ApplicationDbContext类。 We must overwrite the method OnModelCreating to indicate the scheme to which each of the tables generated by ASP.NET Identity will belong.我们必须覆盖方法OnModelCreating以指示由 ASP.NET Identity 生成的每个表所属的方案。 The following link shows the entities used to map each of the tables as well as information about custom builders and options to change the data type of the primary key of each table: Identity Model Customization .以下链接显示了用于映射每个表的实体以及有关自定义构建器的信息和用于更改每个表的主键数据类型的选项: Identity Model Customization

public class ApplicationDbContext : IdentityDbContext {
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }

    protected override void OnModelCreating(ModelBuilder builder) {
        base.OnModelCreating(builder);
        builder.Entity<IdentityUser>().ToTable("AspNetUsers", "myschema");
        builder.Entity<IdentityRole>().ToTable("AspNetRoles", "myschema");
        builder.Entity<IdentityUserClaim>().ToTable("AspNetUserClaims", "myschema");
        builder.Entity<IdentityUserRole>().ToTable("AspNetUserRoles", "myschema");
        builder.Entity<IdentityUserLogin>().ToTable("AspNetUserLogins", "myschema");
        builder.Entity<IdentityRoleClaim>().ToTable("AspNetRoleClaims", "myschema");
        builder.Entity<IdentityUserToken>().ToTable("AspNetUserTokens", "myschema");
    }
}

Now we only have to generate our migration.现在我们只需要生成我们的迁移。 For this in the Package Management Console enter the following command (optionally you can indicate the output route with the -OutputDir parameter):为此,在包管理控制台中输入以下命令(您可以选择使用-OutputDir参数指示输出路由):

Add-Migration InitialSchemaIdentity -OutputDir Data\\Migrations

Then we apply the changes in our database with the command:然后我们使用以下命令在我们的数据库中应用更改:

Update-Database

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM