81 messaggi dal 12 settembre 2010
Ciao Moreno,
ancora grazie...ok sono andato avanti grazie alle tue indicazioni e al libro :)

Vorrei condividere quello che ho impostato fino ad ora:
1) - Dentro il metodo "ConfigureServices" del file "Startup.cs" ho aggiunto due DbContext, uno da utilizzare per mappare le classi con le varie tabelle del DB ed uno ad uso esclusivo delle tabelle del DB che dovranno gestire i dati degli utenti:
services.AddDbContext<BOMCoreContext>(options => options.UseMySql(Configuration.GetConnectionString("DefaultConnection")));

services.AddDbContext<BOMUserContext>(options => options.UseMySql(Configuration.GetConnectionString("DefaultConnection")));
            services.AddDefaultIdentity<Utenti>().AddEntityFrameworkStores<BOMUserContext>();


Poi ho creato una classe nel mio progetto per estendere quella base di "IdentityUser":
public class Utenti : IdentityUser
{
   .....
}


Ho creato la classe "ApplicationDBContext" che ho fatto derivare da "IdentityDbContext" nel modo seguente:
public class ApplicationDBContext : IdentityDbContext<Utenti>
    {
        public ApplicationDBContext(DbContextOptions<ApplicationDBContext> o) : base(o) { }

        public DbSet<Utenti> Utenti { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder o)
        {

        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<Utenti>().ToTable("wn_utenti");
            modelBuilder.Entity<Utenti>(entity =>
            {
                entity.HasKey(e => e.UT_ID);
                entity.Property(e => e.UT_ID).HasColumnType("varchar(255)").HasColumnName("UT_ID");
                entity.Property(e => e.UT_Nome).HasColumnType("varchar(255)").HasColumnName("UT_Nome");
                entity.Property(e => e.UT_Cognome).HasColumnType("varchar(255)").HasColumnName("UT_Cognome");
                entity.Property(e => e.UT_Email).HasColumnType("varchar(255)").HasColumnName("UT_Email");
            });
        }
    }


Poi tramite i comandi che mi hai indicato ho effettuato la migrazione nel DB MySql ed è andato tutto a buon fine.

Scusami per il tempo che ti ho fatto perdere e spero di poterti disturbare nuovamente in caso di bisogno.

Grazie :)
81 messaggi dal 12 settembre 2010
Ciao Moreno,
come non detto...se tento di accedere alla pagina di gestione dei dati dell'utente...per intenderci al percorso "/Account/Manage" ottengo il seguente messaggio di errore "Unable to load user with ID '106f21bc-95c2-456d-851d-a0144e2abce4'."

Portando dentro il progetto le view relative ad alcune aree di gestione del profilo utente mi sono accorto che entra nel seguente punto del file "Index.cshml.cs" della vista principale:
var user = await _userManager.GetUserAsync(User);
            if (user == null)
            {
                return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
            }

Ho notato che nel DB in corrispondenza della tabella "aspnetuserclaims" dopo aver registrato un utente e dopo aver fatto il login la tabella è completamente vuota...sbaglio o dovrebbe essere popolata in qualche modo?

In realtà tutte le altre tabelle che mi sono state generate dopo aver eseguito il comando di migrations sono vuote, ovvero mi riferisco alle tabelle:
- aspnetroleclaims
- aspnetroles
- aspnetuserlogins
- aspnetuserroles
- aspnetusertokens

Sbaglio o in qualche modo dovrebbero essere utilizzate? Cosa sbaglio?

Grazie,
Alessio.
Modificato da Gargano10041983 il 30 ottobre 2018 20.07 -
Modificato da Gargano10041983 il 30 ottobre 2018 20.08 -
81 messaggi dal 12 settembre 2010
Buongiorno Moreno,
sempre io scusami...volevo dirti che il problema che riscontravo l'ho risolto...avevo definito come chiave primaria degli utenti un altro campo e di conseguenza mi generava quell'errore...invece ho fatto in modo di lasciare che il campo chiave primaria sia quello proveniente dalla classe "IdentityUser" ed ora funziona regolarmente...continuò però a notare che dopo essermi registrato e aver fatto il login cmq le altre tabelle restano vuote...quindi non capisco come devono essere utilizzate?
Un altra domanda:
- possibile che se faccio qualche aggiornamento alla classe degli utenti (non so aggiungendo un campo o altro) e rieseguo nuovamente i due comandi:
dotnet ef migration add "Nome migration"
dotnet ef database update

mi restituisce l'errore dicendo che la tabella è già presente?

Grazie,
Alessio.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Alessio,


mi restituisce l'errore dicendo che la tabella è già presente?

Non so esattamente, può darsi che lo schema del database non sia più sincronizzato con le migration. Questo può capire se fai modifiche al database (es. crei una tabella) senza farlo fare alle migration.

Quindi ti chiederei di eliminare le migration e ripartire con un nuovo database. Poi fai:
  • Aggiungi la prima migration con dotnet ef migration add
  • Fai dotnet ef database update per aggiornare lo schema del db
  • Fai una modifica alla classe del tuo utente (es. aggiungi una proprietà di tipo string)
  • Aggiungi un'altra migration
  • Fai di nuovo dotnet ef database update


Fammi sapere se questa operazione va a buon fine. I provider di Pomelo dovrebbero essere in grado di farlo. I provider di Oracle invece no, mi sembra che sono in grado di creare lo schema solo la prima volta, quando ancora non esiste il db.

ciao,
Moreno
Modificato da BrightSoul il 31 ottobre 2018 14.04 -

Enjoy learning and just keep making
81 messaggi dal 12 settembre 2010
Ciao Moreno,
ok ho fatto la prova che mi hai indicato e ha funzionato tutto regolarmente...almeno mi ha aggiunto la colonna ad una tabella già esistente senza nessun tipo di errore e mantenendo i dati presenti.

Grazie,
Alessio.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ok, ottimo Alessio.
Ricordati che se vuoi sfruttare le migration non dovrai più fare modifiche manuali allo schema del database, altrimenti c'è rischio di incontrare problemi, come hai sperimentato.

Questo include qualsiasi genere di modifica, tipo: "ah, questo campo me l'ha creato come Varchar(10) ma io voglio che sia varchar(50)". Anche in questo caso dovrai fare la modifica tramite una migration. Idem per la creazione di indici e vincoli.

ciao,
Moreno
Modificato da BrightSoul il 02 novembre 2018 12.41 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.