Sto cercando di sostituire EF6 con EF Core in un progetto che ho appena iniziato a costruire.
Il problema che sto affrontando è che attualmente sto ereditando il mio contesto da IdentityDbContext come se si stesse usando Identity.
public partial class MyContext : IdentityDbContext<ApplicationUser>
Passare a EF Core richiede l'utilizzo di Identity Core. Questo va bene nel mio livello di accesso ai dati, poiché posso semplicemente fare riferimento a Microsoft.AspNetCore.Identity.EntityFrameworkCore.
Il vero problema che ho scoperto è stato quando ho tentato di utilizzarlo nella mia applicazione MVC .Net 4.7 in cui Identity Core non funzionerà in quanto non è .Net Core.
Quindi è la mia migliore opzione per dividere semplicemente Identity nel suo contesto o esiste un modo in cui posso utilizzare EF Core come attualmente sto ereditando l'IdentityContext usando non Identity Core?
O ho l'estremità sbagliata del bastone ...
Grazie
Quello che ho appena fatto è stato di ri-implementare la funzionalità da IdentityDbContext direttamente sul mio DbContext + gli archivi utente forniti. Non c'è davvero nessuna magia coinvolta. L'unica cosa che fa IdentityDbContext è aggiungere alcuni set di dati e alcuni mapping al tuo contesto.
Puoi trovare tutto ciò che ti serve qui: https://github.com/aspnet/AspNetIdentity/tree/master/src/Microsoft.AspNet.Identity.EntityFramework
Stiamo usando Guids come ID per avere già classi personalizzate come CustomUserLogin
ereditate da IdentityUserLogin
quindi ho spostato tutto dalla classe base in quella classe.
Una cosa che vedrai è che il vecchio codice non ha proprietà di navigazione adeguate in entrambe le direzioni. Ho aggiunto questo così ho potuto alla mappatura come questa:
private void SetupIdentityTables(ModelBuilder modelBuilder)
{
var user = modelBuilder.Entity<ApplicationUser>()
.ToTable("AspNetUsers");
user.HasMany(u => u.Roles).WithOne().HasForeignKey(ur => ur.UserId);
user.HasMany(u => u.Claims).WithOne().HasForeignKey(uc => uc.UserId);
user.HasMany(u => u.Logins).WithOne().HasForeignKey(ul => ul.UserId);
user.Property(u => u.UserName)
.IsRequired()
.HasMaxLength(256);
user.HasIndex(x => x.UserName).HasName("UserNameIndex").IsUnique();
// CONSIDER: u.Email is Required if set on options?
user.Property(u => u.Email).HasMaxLength(256);
modelBuilder.Entity<CustomUserRole>()
.ToTable("AspNetUserRoles")
.HasKey(r => new { r.UserId, r.RoleId });
modelBuilder.Entity<CustomUserLogin>()
.ToTable("AspNetUserLogins")
.HasKey(l => new { l.LoginProvider, l.ProviderKey, l.UserId });
modelBuilder.Entity<CustomUserClaim>()
.ToTable("AspNetUserClaims");
var role = modelBuilder.Entity<CustomRole>()
.ToTable("AspNetRoles");
role.Property(r => r.Name)
.IsRequired()
.HasMaxLength(256);
role.HasIndex(x => x.Name).HasName("RoleNameIndex").IsUnique();
role.HasMany(r => r.Users).WithOne().HasForeignKey(ur => ur.RoleId);
}
NOTA: questo codice non funziona perfettamente in quanto ha alcuni problemi di chiave esterna. Dovrò dare un'altra occhiata alle mappature ma dovresti avere almeno l'idea.