【发布时间】:2014-05-23 12:34:09
【问题描述】:
我正在使用 Identity 2.0 和 Entity Framework 6.0 构建一个 ASP.NET MVC 5 Web 应用程序,并且正在使用代码优先迁移。我正在使用自定义身份验证系统(不是 .NET)的现有数据库上构建它,我希望将数据从现有用户表迁移到新的身份表(AspNetUser 和 AspNetClaims)。
我有一个创建新表的 InitialCreate 迁移,我想在迁移运行时使用现有用户表中的数据填充这些表。我不想只使用 Identity 2.0 的现有表,所以不想只用 [Table("oldtablename"] 属性装饰模型。
我知道 Up() 方法中有可用的 Sql() 方法,但我想使用自动创建的 Identity 类 - AccountController->Register(RegisterViewModel) - 所以正确的哈希值、guid 是在 AspNetUser 表中创建。 UserDetails 模型包含来自旧表的用户数据(用户名、密码 [plain-text ..eek])。
以下是我的代码:
public partial class InitialCreate : DbMigration
{
public override void Up() {
..// Create new AspNetTables etc...
// Migrate records from old classic asp authentication to ASP.NET Identity
ApplicationDbContext udc = new ApplicationDbContext();
var users = udc.UserDetails;
AccountController ac = new AccountController();
foreach(UserDetails u in users) {
ac.Register(new RegisterViewModel {
UserName = u.UserLogin,
Password = Crypto.HashPassword(u.UserPass),
ConfirmPassword = Crypto.HashPassword(u.UserPass)
})
}
}
但是,当我运行 Update-Database 以应用迁移时,尽管新的 AspNet 表已成功创建,但新用户并未在 AspNetUsers 表中创建。 从包控制台管理器运行时 DbContext 是否不可用?或者发生了什么?我在 ASP.NET 停用 3 年后才重新开始使用它,所以我仍在尝试找出新的架构。
包管理器控制台的输出是:
Applying explicit migrations: [201404090639371_InitialCreate].
Applying explicit migration: 201404090639371_InitialCreate.
System.Runtime.Remoting.RemotingException: Object '/a5a2f6bb_b6a4_4de9_9439_d0abfcf7efe3/i8xnyqr81tjkwllqwr1npgaj_501.rem' has been disconnected or does not exist at the server.
at System.Data.Entity.Migrations.Design.ToolingFacade.ToolLogger.Verbose(String sql)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement)
at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection)
at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClass32.<ExecuteStatements>b__2e()
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.<Execute>b__0()
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation)
at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements)
at System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable`1 migrationStatements)
at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable`1 operations, IEnumerable`1 systemOperations, Boolean downgrading, Boolean auto)
at System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration migration, DbMigration lastMigration)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ApplyMigration(DbMigration migration, DbMigration lastMigration)
at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration)
at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b()
at System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
at System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)
at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run()
at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
at System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force)
at System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()
at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
Object '/a5a2f6bb_b6a4_4de9_9439_d0abfcf7efe3/i8xnyqr81tjkwllqwr1npgaj_501.rem' has been disconnected or does not exist at the server.
【问题讨论】:
-
在 AccountController 中提供 Register 方法的源代码。如果您使用的是由 MVC 5 模板生成的未经修改的模板,则不会传入散列密码。散列由 UserManager.Create 方法处理,我会直接调用它而不是通过 Register 方法。
标签: c# asp.net entity-framework asp.net-identity entity-framework-migrations