Il y a quelque temps, j'ai créé un site Web ASP.NET MVC 5 avec la version Identity 1.0, et j'ai créé les tables d'identité avec ce projet. Maintenant, je dois créer un autre site Web en utilisant la même base de données pour l'authentification, mais maintenant la version Identity est 2.0. Ainsi, lorsque j'essaie de m'authentifier sur le nouveau site Web, je reçois des erreurs.
Im essayant de migrer la base de données en utilisant l'approche Migrations, mais son confus et im obtenir cette erreur There is already an object named 'AspNetRoles' in the database.
lorsque je tape Update-Database dans la console PM.
Ma question est de savoir comment utiliser au mieux la même base de données pour l'authentification des deux sites (l'un utilisant la version d'identité 1.0 et l'autre utilisant 2.0). Dois-je vraiment migrer la base de données?
Si oui, comment puis-je résoudre cette erreur que je reçois?
Add-Migration InitialMigrations -IgnoreChanges
Cela devrait générer un fichier "InitialMigration" vierge. Maintenant, ajoutez les modifications souhaitées à la classe souhaitée. Une fois les modifications ajoutées, exécutez à nouveau la commande de mise à jour:
update-database -verbose
Maintenant, la migration automatique sera appliquée et le tableau sera modifié avec vos modifications.
Edit: Voici une solution pour migrer l'identité 1 vers 2 Mise à niveau d'ASP.NET.Identity 1.0 vers 2. Utilisez ce manuel migration
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");
}
Bien que vous puissiez (depuis EF6) utiliser des migrations dans deux projets distincts pour la même base de données, il ne peut y avoir de chevauchement. Le fonctionnement des migrations se fait via un dbo._MigrationHistory
table qui stocke le contexte qui a généré la migration et l'état du modèle de votre application, qui inclut les modèles d'identité.
Lorsque vous essayez de connecter votre deuxième application, elle ne trouve aucune migration précédente et doit donc générer sa migration initiale, qui comprendra également des tables pour les modèles d'identité, qui sont également dans son contexte. Voilà où est votre problème.
Pour les besoins de l'identité, vous devez choisir un projet pour créer le master. Celui-ci utilisera un IdentityDbContext
standard où les modèles d'identité seront migrés.
L'autre projet devra être transformé en esclave, au moins en termes d'utilisation de l'identité. Vous devrez donc interagir avec au moins deux contextes dans cette application. L'une sera une sous-classe de IdentityDbContext
, mais traitée comme une base de données en premier:
public class MyIdentityContext : IdentityDbContext<ApplicationUser>
{
public MyIdentityContext()
: base("ConnectionStringNameForYourSharedDB")
{
Database.SetInitializer<MyIdentityContext>(null);
}
}
L'autre contexte sera juste une sous-classe DbContext
régulière qui sera migrée normalement. Vous devrez répéter cette opération pour tout autre projet pouvant avoir besoin d'accéder aux mêmes informations d'identité à partir de la même base de données. En outre, en raison du code répétitif, cela entraînera (et le fait que votre classe ApplicationUser
devra être partagée), vous devez déplacer ce code dans une bibliothèque de classes que chaque projet peut référencer.
J'ai rencontré le même bug que ci-dessous. Ensuite, je l'ai corrigé comme ci-dessous: (.NET Core/EF Core)
Vérifiez les bases de données actuelles de votre projet:
dotnet ef migrations list
Si le plus récent est ce que vous avez ajouté, supprimez-le:
dotnet ef migrations remove
Les sorties de garantie de cette base de données doivent être dételées dans le code source:
Fichiers .cs/.Designer.cs
Maintenant ça va. Essayez de rajouter:
dotnet ef migrations add [new_dbo_name]
Enfin, essayez de mettre à jour à nouveau, dans la base de l'arrangement sur la liste de migration:
dotnet ef database update [First]
dotnet ef database update [Second]
...
dotnet ef database update [new_dbo_name]
J'espère que cela vous sera utile.