asp.net-mvc - the - @model mvc
Ya existe un objeto llamado ''AspNetRoles'' en la base de datos (2)
Si bien puede (desde EF6) usar migraciones en dos proyectos separados para la misma base de datos, no puede haber ninguna superposición. La forma en que funcionan las migraciones es a través de una tabla dbo._MigrationHistory
que almacena el contexto que generó la migración y el estado del modelo de su aplicación, que incluye los modelos de Identidad.
Cuando intenta conectar su segunda aplicación, no encuentra migraciones anteriores y, por lo tanto, necesita generar su migración inicial, que incluirá tablas para los modelos de Identidad, que también se encuentran en su contexto. Ahí es donde está tu problema.
Para los propósitos de Identidad, debe elegir un proyecto para hacer el máster. Este utilizará un IdentityDbContext
estándar donde se migrarán los modelos de Identidad.
El otro proyecto deberá convertirse en esclavo, al menos en términos de utilización de Identidad. Por lo tanto, deberá interactuar con al menos dos contextos en esta aplicación. Una será una subclase de IdentityDbContext
, pero tratada como una base de datos primero:
public class MyIdentityContext : IdentityDbContext<ApplicationUser>
{
public MyIdentityContext()
: base("ConnectionStringNameForYourSharedDB")
{
Database.SetInitializer<MyIdentityContext>(null);
}
}
El otro contexto será solo una subclase DbContext
regular que se DbContext
normalmente. Deberá repetir esto para cualquier otro proyecto que pueda necesitar acceso a la misma información de identidad de la misma base de datos. Además, debido al código repetitivo al que esto conducirá (y al hecho de que su clase ApplicationUser
tendrá que compartirse) debe mover este código a una biblioteca de clases a la que cada proyecto pueda hacer referencia.
Hace algún tiempo, creé un sitio web ASP.NET MVC 5 con la versión Identity 1.0, y creé las tablas de identidad con este proyecto. Ahora tengo que hacer otro sitio web usando la misma base de datos para la autenticación, pero ahora la versión de Identity es 2.0. Así que cuando intento autenticar en el nuevo sitio web obtengo algunos errores.
Estoy tratando de migrar la base de datos utilizando el enfoque de Migraciones, pero está confundido y There is already an object named ''AspNetRoles'' in the database.
este error. There is already an object named ''AspNetRoles'' in the database.
cuando escribo Update-Database en la consola de PM.
Mi pregunta es, ¿cuál es la mejor manera de usar la misma base de datos para la autenticación de ambos sitios (uno con la versión de identidad 1.0 y otro con 2.0)? ¿Realmente necesito migrar la base de datos?
Si es así, ¿cómo puedo solucionar este error que estoy recibiendo?
Add-Migration InitialMigrations -IgnoreChanges
Esto debería generar un archivo "InitialMigration" en blanco. Ahora, agregue cualquier cambio deseado a la clase que desea. Una vez que se agreguen los cambios, ejecute de nuevo el comando de actualización:
update-database -verbose
Ahora se aplicará la migración automática y la tabla se modificará con los cambios.
Edición: Aquí hay una solución para migrar la identidad 1 a 2 Actualizando de ASP.NET.Identity 1.0 a 2.0 Use esta migración manual
public override void Up()
{
RenameColumn(table: "dbo.AspNetUserClaims", name: "User_Id", newName: "UserId");
RenameIndex(table: "dbo.AspNetUserClaims", name: "IX_User_Id", newName: "IX_UserId");
DropPrimaryKey("dbo.AspNetUserLogins");
AddColumn("dbo.AspNetUsers", "Email", c => c.String(maxLength: 256));
AddColumn("dbo.AspNetUsers", "EmailConfirmed", c => c.Boolean(nullable: false));
AddColumn("dbo.AspNetUsers", "PhoneNumber", c => c.String());
AddColumn("dbo.AspNetUsers", "PhoneNumberConfirmed", c => c.Boolean(nullable: false));
AddColumn("dbo.AspNetUsers", "TwoFactorEnabled", c => c.Boolean(nullable: false));
AddColumn("dbo.AspNetUsers", "LockoutEndDateUtc", c => c.DateTime());
AddColumn("dbo.AspNetUsers", "LockoutEnabled", c => c.Boolean(nullable: false));
AddColumn("dbo.AspNetUsers", "AccessFailedCount", c => c.Int(nullable: false));
AlterColumn("dbo.AspNetUsers", "UserName", c => c.String(nullable: false, maxLength: 256));
AlterColumn("dbo.AspNetUsers", "FirstName", c => c.String(nullable: false));
AlterColumn("dbo.AspNetUsers", "LastName", c => c.String(nullable: false));
AddColumn("dbo.AspNetUsers", "CreatedDateTime", c => c.DateTime(nullable: false));
AlterColumn("dbo.AspNetRoles", "Name", c => c.String(nullable: false, maxLength: 256));
AddPrimaryKey("dbo.AspNetUserLogins", new[] { "LoginProvider", "ProviderKey", "UserId" });
CreateIndex("dbo.AspNetUsers", "UserName", unique: true, name: "UserNameIndex");
CreateIndex("dbo.AspNetRoles", "Name", unique: true, name: "RoleNameIndex");
DropColumn("dbo.AspNetUsers", "Discriminator");
}