[英]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.
这就是为什么这对我更好。
add-migration
on your project and let it create a migrationadd-migration
并让它创建一个迁移update-database
to get those changes updatedupdate-database
以更新这些更改add-migration
again and let it create a new migrationadd-migration
并让它创建一个新的迁移OnModelCreating
method of your configuration with the code belowOnModelCreating
方法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):首先,我们必须验证我们的项目是否干净(在包管理控制台中插入命令):
Drop-Database
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.