2014-06-11 5 views
14

Qualche tempo fa, ho creato un sito Web ASP.NET MVC 5 con la versione Identity 1.0 e ho creato le tabelle Identity con questo progetto. Ora devo creare un altro sito Web utilizzando lo stesso database per l'autenticazione, ma ora la versione Identity è 2.0. Quindi quando provo ad autenticarmi nel nuovo sito ottengo alcuni errori.C'è già un oggetto denominato "AspNetRoles" nel database

Sto cercando di migrare il database utilizzando l'approccio Migrations, ma è confuso e sto ottenendo questo errore There is already an object named 'AspNetRoles' in the database. quando si digita Update-Database nella console PM.

La mia domanda è, come è il modo migliore per utilizzare lo stesso database per l'autenticazione di entrambi i siti (uno che utilizza la versione dell'identità 1.0 e altro che utilizza 2.0). Ho davvero bisogno di migrare il database?

Se sì, come posso risolvere questo errore che sto ottenendo?

risposta

33
Add-Migration InitialMigrations -IgnoreChanges 

Questo dovrebbe generare un file "InitialMigration" vuoto. Ora, aggiungi le modifiche desiderate alla classe che desideri. Una volta aggiunte modifiche, eseguire nuovamente il comando di aggiornamento:

update-database -verbose 

Ora verrà applicata la migrazione automatica e la tabella verrà modificato con le modifiche.

Edit: Ecco una soluzione per la migrazione dell'identità 1-2 Upgrading from ASP.NET.Identity 1.0 to 2.0 Utilizzare questa migrazione manuale

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"); 
    } 
+0

grazie! ora non ricevo questo errore, ma sto ricevendo questo "" Nome colonna non valido "Email". \ r \ nNome colonna non valido "EmailConfirmed". \ r \ nNome colonna non valido "PhoneNumber". "quando provo ad accedere. Ci sono altre modifiche Ho bisogno di fare in questo modello utente? Sto usando IdentityUser senza proprietà personalizzate. – gog

+0

Ecco una soluzione per migrare l'identità 1 a 2 [collegamento] http://adamstephensen.com/2014/05/02/upgrading-from-asp-net-identity-1-0-to-2-0/ –

9

Sebbene sia possibile (a partire da EF6) utilizzare le migrazioni in due progetti separati per lo stesso database, non è possibile che si verifichi alcuna sovrapposizione. Il modo in cui le migrazioni funzionano è attraverso una tabella dbo._MigrationHistory che archivia il contesto che ha generato la migrazione e lo stato del modello dell'applicazione, che include i modelli Identity.

Quando si tenta di connettere la seconda applicazione, non vengono rilevate migrazioni precedenti e pertanto è necessario generare la migrazione iniziale, che includerà le tabelle per i modelli Identity, anch'esse nel relativo contesto. Ecco dove si trova il tuo problema.

Ai fini dell'identità, è necessario scegliere un progetto per creare il master. Questo utilizzerà lo standard IdentityDbContext in cui verranno migrati i modelli di identità.

L'altro progetto dovrà essere reso schiavo, almeno in termini di utilizzo dell'identità. Quindi, dovrai interagire con almeno due contesti in questa applicazione. Uno sarà una sottoclasse di IdentityDbContext, ma trattati come database prima:

public class MyIdentityContext : IdentityDbContext<ApplicationUser> 
{ 
    public MyIdentityContext() 
     : base("ConnectionStringNameForYourSharedDB") 
    { 
     Database.SetInitializer<MyIdentityContext>(null); 
    } 
} 

L'altro contesto sarà solo un normale DbContext sottoclasse che verrà migrato come normale. Dovrai ripetere questo per qualsiasi altro progetto che potrebbe richiedere l'accesso alle stesse informazioni di identità dallo stesso database. Inoltre, a causa del codice ripetitivo che questo porterà (e del fatto che la tua classe ApplicationUser dovrà essere condivisa) dovresti spostare questo codice in una libreria di classi a cui ogni progetto può fare riferimento.