Wiem, że to stary post, ale mam dzisiaj ten sam problem i trochę go zbadałem, i chcę podzielić się moimi odkryciami i rozwiązaniem.
Problem polega na tym, że Microsoft dodał między wersjami unikalny indeks do Name
kolumna AspNetRoles
, a ponieważ ta kolumna ma rozmiar 256, łamie zasady indeksowania MySql. Ten problem wystąpi również na Name
kolumna na AspNetUsers
.
Poszedłem więc przeanalizować, jak to naprawić i myślę, że najbardziej poprawnym rozwiązaniem jest zmniejszenie długości Name
kolumna (IMHO to naprawdę nie jest żaden powód, aby mieć rolę/użytkownika o tak długiej nazwie).
Po zbadaniu kodu w IdentityDbContext (która jest klasą bazową) uważam, że najbardziej poprawnym rozwiązaniem tego problemu jest nadpisanie OnModelCreating
w ApplicationDbContext
i dostosuj tam rozmiary kolumn w ten sposób:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
//... default code for ApplicationDbContext
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
if (modelBuilder == null)
{
throw new ArgumentNullException("modelBuilder");
}
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<ApplicationUser>().Property(u => u.UserName).HasMaxLength(128);
//Uncomment this to have Email length 128 too (not neccessary)
//modelBuilder.Entity<ApplicationUser>().Property(u => u.Email).HasMaxLength(128);
modelBuilder.Entity<IdentityRole>().Property(r => r.Name).HasMaxLength(128);
}
}
Ten kod zainicjuje model tożsamości z domyślną konfiguracją z base.OnModelCreating
wywołaj, a następnie nadpisz ustawienia wykonane w klasie bazowej naszymi własnymi.
Ponieważ tworzysz projekt migracji, musisz ponownie uruchomić tworzenie migracji, aby uzyskać zaktualizowany model (lub ręcznie zmodyfikować model, aby dostosować rozmiary kolumn).
To rozwiąże problem i będziesz mieć pełną funkcjonalność systemu Asp.NET Identity.
Oczywiście, aby nie uzyskać żadnych błędów podczas tworzenia projektu, możesz po prostu zmodyfikować kod migracji, ale wtedy będziesz mieć różnicę w modelu zdefiniowanym przez kontekst, który nie jest dobry i może powodować problemy.