我首先使用MVC5 EF6代码使用ASP.NET Identity 1.0,并希望在自定义模式中创建表。即不是DBO模式的模式。
我使用EF电源工具对我的数据逆转了,并将映射类中所有其他表的架构名称设置为以下
this.ToTable("tableName", "schemaName");
我尝试为ASP.NET表做此操作,但它一直给我带来很多错误,最终我放弃了。如果我从项目中排除(反设计)ASP.NET身份表,它们将被创建,但始终在DBO架构中
有人知道该怎么做吗?
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");
}
}
这是一个较晚的条目,解释了我的所作所为。不确定是否有更好的方法,但这是对我有用的唯一东西。
公平地说,我的上下文中有一个单个模型。这就是为什么这对我更好的原因。
- 提前在数据库中生成表(而表格仍在" DBO"中)
- 在您的项目上执行
add-migration
,让它创建迁移 - 将迁移代码中的所有模式更改为所需的模式
- 执行
update-database
以获取这些更改 - 删除您的原始迁移文件(其'哈希对您没有用)
- 再次执行
add-migration
,让它创建一个新的迁移 - 使用下面的代码更新配置的
OnModelCreating
- 运行您的应用程序并开始注册用户
注意:
你不想要这个。
// This globally assigned a new schema for me (for ALL models)
modelBuilder.HasDefaultSchema("security");
配置:onModelCreating
这仅为上述表格分配了一个新架构
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");
}
初始迁移看起来像
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");
}
}
对不起,我的英语,我使用Google Translator。
没有必要由Prisioner Zero指示的一些步骤。所提供的指示基于具有单个用户帐户安全的标准模板。
首先,我们必须验证我们的项目是否干净(插入包装管理控制台中的命令):
- 如果您已经拥有使用默认ASP.NET身份模式创建的数据库,则必须使用以下命令删除数据库(或直接在SQL Server中删除):
Drop-Database
- 如果您具有ASP.NET身份模板的默认迁移,请执行以下命令以删除它:
Remove-Migration
现在我们的项目很干净,我们必须修改ApplicationDbContext
类。我们必须覆盖OnModelCreating
的方法,以指示ASP.NET身份生成的每个表所属的表所属的方案。以下链接显示了用于映射每个表的实体以及有关自定义构建器的信息以及更改每个表主要密钥的数据类型的选项:身份模型自定义。
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");
}
}
现在我们只需要生成迁移。为此,在"软件包管理控制台"中输入以下命令(您可以选择使用-OutputDir
参数指示输出路由):
Add-Migration InitialSchemaIdentity -OutputDir DataMigrations
然后,我们将数据库中的更改应用于命令:
Update-Database