2014-06-11 11 views
14

Jakiś czas temu utworzyłem stronę ASP.NET MVC 5 z wersją Identity 1.0 i utworzyłem tabele tożsamości z tym projektem. Teraz muszę zrobić inną stronę przy użyciu tej samej bazy danych do uwierzytelniania, ale teraz wersja Identity ma 2.0. Więc kiedy próbuję uwierzytelnić się na nowej stronie, dostaję błędy.Istnieje już obiekt o nazwie "AspNetRoles" w bazie danych

Próbuję przeprowadzić migrację bazy danych przy użyciu podejścia Migracje, ale jest ona zdezorientowana i otrzymuję ten błąd There is already an object named 'AspNetRoles' in the database., gdy wpisuję aktualizację bazy danych w konsoli PM.

Moje pytanie brzmi: w jaki sposób najlepiej użyć tej samej bazy danych do uwierzytelniania obu witryn (jednej z wersją 1.0 tożsamości i drugiej z użyciem 2.0). Czy naprawdę muszę przeprowadzić migrację bazy danych?

Jeśli tak, w jaki sposób mogę rozwiązać ten błąd?

Odpowiedz

33
Add-Migration InitialMigrations -IgnoreChanges 

To powinno wygenerować pusty plik "InitialMigration". Teraz dodaj pożądane zmiany do wybranej klasy. Po dodaniu zmian uruchom ponownie komendę aktualizacji:

update-database -verbose 

Teraz przeprowadzona zostanie automatyczna migracja, a tabela zostanie zmieniona wraz z wprowadzonymi zmianami.

Edit: Oto rozwiązanie do migracji Tożsamość 1 do 2 Upgrading from ASP.NET.Identity 1.0 to 2.0 używać tego podręcznika migracji

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

dzięki! teraz nie otrzymuję tego błędu, ale otrzymuję "" Nieprawidłowa nazwa kolumny "E-mail". \ r \ nNiepoprawna nazwa kolumny "EmailConfirmed". \ r \ nNiepoprawna nazwa kolumny "Numer telefonu". "podczas próby zalogowania się. Inne zmiany muszę zrobić w tym modelu użytkownika? Im przy użyciu IdentityUser bez niestandardowych właściwości. – gog

+0

Oto rozwiązanie migracji tożsamości od 1 do 2 [link] http://adamstephensen.com/2014/05/02/upgrading-from-asp-net-identity-1-0-to-2-0/ –

9

Chociaż można (ponieważ EF6) używać migracji w dwóch osobnych projektach dla tej samej bazy danych, nie może być żadnego nakładania się. Sposób działania migracji odbywa się za pomocą tabeli dbo._MigrationHistory, która przechowuje kontekst, który wygenerował migrację i stan modelu aplikacji, który obejmuje modele tożsamości.

Podczas próby połączenia drugiej aplikacji nie znajduje ona wcześniejszych migracji i dlatego musi wygenerować początkową migrację, która będzie zawierała tabele dla modeli tożsamości, które również znajdują się w jej kontekście. To jest twój problem.

Dla potrzeb Tożsamości należy wybrać jeden projekt, aby utworzyć wzorzec. Ten będzie używał standardu IdentityDbContext, gdzie migrowane będą modele tożsamości.

Drugi projekt będzie musiał zostać niewolnikiem, przynajmniej jeśli chodzi o wykorzystanie Tożsamości. Tak więc w tej aplikacji będziesz musiał wchodzić w interakcję z co najmniej dwoma kontekstami. Jedna z nich będzie podklasą IdentityDbContext, ale traktowane jako baza pierwszego:

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

Drugi kontekst będzie zwykłym DbContext podklasa które zostaną przeniesione jako normalne. Powtórz to dla dowolnego innego projektu, który może potrzebować dostępu do tej samej informacji Tożsamości z tej samej bazy danych. Również ze względu na powtarzający się kod, który doprowadzi do tego (oraz fakt, że twoja klasa ApplicationUser musi być udostępniona) powinieneś przenieść ten kod do biblioteki klas, do której każdy projekt może się odwoływać.

Powiązane problemy