În baza de date există deja un obiect numit „AspNetRoles”. (Programare, Asp.Net Mvc, Cadru De Entități, Identitate, Asp.Net Identity)

gog a intrebat.

Cu ceva timp în urmă, am creat un site web ASP.NET MVC 5 cu versiunea Identity 1.0 și am creat tabelele Identity cu acest proiect. Acum trebuie să creez un alt site web care utilizează aceeași bază de date pentru autentificare, dar acum versiunea Identity este 2.0. Deci, când încerc să mă autentific în noul site web, primesc câteva erori.

Încerc să migrez baza de date utilizând abordarea Migrations, dar nu se înțelege nimic și primesc următoarea eroare There is already an object named 'AspNetRoles' in the database. când scriu Update-Database în consola PM.

Întrebarea mea este: care este cea mai bună modalitate de a utiliza aceeași bază de date pentru autentificarea ambelor site-uri (unul care utilizează versiunea de identitate 1.0 și celălalt care utilizează versiunea 2.0). Chiar trebuie să migrez baza de date?

Dacă da, cum pot să rezolv această eroare pe care o primesc?

6 răspunsuri
Mohsen Esmailpour
Add-Migration InitialMigrations -IgnoreChanges

Acest lucru ar trebui să genereze un fișier „InitialMigration” gol. Acum, adăugați orice modificări dorite la clasa pe care o doriți. După ce modificările sunt adăugate, rulați din nou comanda de actualizare:

update-database -verbose

Acum, migrația automată va fi aplicată și tabelul va fi modificat cu modificările dvs.

Editați:Iată o soluție pentru a migra identitatea 1 la 2 Actualizarea de la ASP.NET.Identity 1.0 la 2.0Utilizați această migrare 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");
    } 

Comentarii

  • mulțumesc! acum nu mai primesc această eroare, dar primesc acest „”Invalid column name ‘Email’.r
    Invalid column name ‘EmailConfirmed’.r
    Invalid column name ‘PhoneNumber’.”” când încerc să mă conectez. Sunt alte modificări pe care trebuie să le fac în acest model de utilizator? Folosesc IdentityUser fără proprietăți personalizate. –  > Por gog.
  • Iată o soluție de migrare a identității 1 la 2 [link]adamstephensen.com/2014/05/02/… –  > Por Mohsen Esmailpour.
  • Eu doar primesc A parameter cannot be found that matches parameter name 'IgnoreChanges'. în EF Core –  > Por Bassie.
  • Această soluție este pentru EF 6 și nu știu dacă funcționează cu EF Core. –  > Por Mohsen Esmailpour.
  • Acest lucru a funcționat pentru mine ca un farmec Eu folosesc mvc5 cu EF6 –  > Por M Hanif.
Chris Pratt

Deși puteți (de la EF6) să folosiți migrații în două proiecte separate pentru aceeași bază de date, nu poate exista nicio suprapunere. Modul în care funcționează migrațiile este prin intermediul unui dbo._MigrationHistory tabel care stochează contextul care a generat migrația și starea modelului aplicației dumneavoastră, care include modelele de identitate.

Atunci când încercați să vă conectați a doua aplicație, aceasta nu găsește nicio migrare anterioară și, prin urmare, trebuie să genereze migrarea sa inițială, care va include tabele pentru modelele de identitate, care se află și ele în contextul său. Aici este problema dumneavoastră.

În scopul Identity, trebuie să alegeți un singur proiect pentru a deveni master. Acesta va utiliza un proiect standard IdentityDbContext în care vor fi migrate modelele de Identitate.

Celălalt proiect va trebui să fie transformat în sclav, cel puțin în ceea ce privește utilizarea Identity. Astfel, va trebui să interacționați cu cel puțin două contexte în această aplicație. Unul va fi o subclasă de IdentityDbContext, dar tratată ca bază de date în primul rând:

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

Celălalt context va fi doar o clasă obișnuită DbContext subclasă care va fi migrat în mod normal. Va trebui să repetați acest lucru pentru orice alt proiect care ar putea avea nevoie de acces la aceleași informații de identitate din aceeași bază de date. De asemenea, din cauza codului repetitiv la care va duce acest lucru (și din cauza faptului că ApplicationUser clasa va trebui să fie partajată) ar trebui să mutați acest cod într-o bibliotecă de clase la care fiecare proiect să poată face referire.

Sinha Islam Owisy

În fișierul „appsettings.json”, modificați numele bazei de date

"ConnectionStrings": {
    "DefaultConnection": "Server=DESKTOP-S0S1I;Database=New_name_here;Trusted_Connection=True;"

și apoi

add-migration 
update-database

Funcționează.

Comentarii

  • Notă: Acest lucru creează o nouă bază de date în întregime. –  > Por Qudus.
pamal Sahan

pentru asta mai întâi trebuie să eliminăm migrația pe care am migrat-o recent dotnet ef migrations remove -s ..InvoiceManagement

apoi ștergeți fișierul *.Designer.cs din dosarul de migrare

în cele din urmă dotnet ef database update -s ..InvoiceManagement -s înseamnă că proiectul de pornire (webApi) nu uitați că acest cod ar trebui să fie utilizat în fișierul DBcontext conține calea dosarului.acest cod este utilizat în vscode pentru webapi.

Jimmy

Pentru mine, problema nu a putut fi rezolvată prin adăugarea unei migrații goale. Problema mea era că tabelul __EFMigrationsHistory fusese golit manual. În consecință, tabelul context.Database.Migrate() metoda a crezut că trebuie să aplice toate migrațiile lipsă (intrări lipsă în __EFMigrationsHistory). Este suficient să adăugați toate migrațiile lipsă în tabelul db și ar trebui să funcționeze din nou.

Mai Nguyen

M-am confruntat cu aceeași eroare ca mai jos. Apoi am rezolvat-o ca mai jos: (.NET Core / EF Core)

  1. Verificați bazele de date curente din proiectul dvs:

    dotnet ef migrations list
    
  2. Dacă cea mai nouă este cea pe care ați adăugat-o, atunci eliminați-o:

    dotnet ef migrations remove
    
  3. Ieșirile de garanție ale acestei baze de date trebuie să fie deteledate în codul sursă:

    Fișiere .cs/.Designer.cs

  4. Acum este în regulă. Încercați să o adăugați din nou:

    dotnet ef migrations add [new_dbo_name]
    
  5. În cele din urmă, încercați să actualizați din nou, în baza de aranjare pe lista de migrare:

    dotnet ef database update [First]
    dotnet ef database update [Second]
    ...
    dotnet ef database update [new_dbo_name]
    

Sper că vă este de ajutor.