234 messaggi dal 08 marzo 2012
Ciao,

ho una relazione one-to-many sulla quale vorrei impostare il fatto che alla cancellazione del record padre sul db vengano cancellati in automatico anche i record figli (collegati tramite foreign key).
Attualmente invece, nonostante la modifica sotto riportata, quando cancello il record padre mi imposta la foreign key dei figli a NULL.

Ecco il codice che ho inserito:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Model.Dossier.Option>()
               .HasMany(x => x.OptionsPossibleValues)
               .WithRequired()
               .WillCascadeOnDelete(true);

            base.OnModelCreating(modelBuilder);
        } 


e questo quella che ha generato Migration tramite il comando "Add-Migration"

public partial class CascadeDeleteOptionPossibleValue : DbMigration
    {
        public override void Up()
        {
            DropForeignKey("dbo.OptionsPossibleValues", "Option_OptionId", "dbo.Options");
            DropIndex("dbo.OptionsPossibleValues", new[] { "Option_OptionId" });
            AlterColumn("dbo.OptionsPossibleValues", "Option_OptionId", c => c.Int(nullable: false));
            CreateIndex("dbo.OptionsPossibleValues", "Option_OptionId");
            AddForeignKey("dbo.OptionsPossibleValues", "Option_OptionId", "dbo.Options", "OptionId", cascadeDelete: true);
        }
        
        public override void Down()
        {
            DropForeignKey("dbo.OptionsPossibleValues", "Option_OptionId", "dbo.Options");
            DropIndex("dbo.OptionsPossibleValues", new[] { "Option_OptionId" });
            AlterColumn("dbo.OptionsPossibleValues", "Option_OptionId", c => c.Int());
            CreateIndex("dbo.OptionsPossibleValues", "Option_OptionId");
            AddForeignKey("dbo.OptionsPossibleValues", "Option_OptionId", "dbo.Options", "OptionId");
        }
    }


Inoltre c'è una cosa che non capisco.
Io scrivo delle istruzioni facendo l'ovveride di "OnModelCreating(DbModelBuilder modelBuilder)" ma poi cosa succede, ovvero quest'istruzione andrà in esecuzione ogni volta??

Oppure devo eliminarla una volta che ho eseguito il comando "Add-Migration" che quindi mi ha generato le corrispondenti istruzioni per il DB nella sottocartella "Migrations"?

Grazie!
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


Attualmente invece, nonostante la modifica sotto riportata, quando cancello il record padre mi imposta la foreign key dei figli a NULL.

In questo caso la foreign key non deve essere nullable e infatti hai creato una migration per correggere questo problema. Ora devi mandarla in esecuzione con il comando Update-Database e così lo schema del database verrà aggiornato.
(Non ho capito però se il database l'hai creato tu a mano o se lo lasci creare/aggiornare alle migrations).


Io scrivo delle istruzioni facendo l'ovveride di "OnModelCreating(DbModelBuilder modelBuilder)" ma poi cosa succede, ovvero quest'istruzione andrà in esecuzione ogni volta??

Va in esecuzione una volta dopo l'avvio dell'applicazione. Non immediatamente ma la prima volta che usi il DbContext per accedere al database.
L'override di OnModelCreating serve al DbContext a ricreare l'entity data model, che nel caso di code first è mancante (mentre esiste invece con gli approcci database-first e model-first - è il file edmx che contiene la definizione dei modelli contestuale e relazionale e del loro mapping).


Oppure devo eliminarla una volta che ho eseguito il comando "Add-Migration

No no, lascia tutto lì dov'è.

ciao,
Moreno

Enjoy learning and just keep making
234 messaggi dal 08 marzo 2012

In questo caso la foreign key non deve essere nullable e infatti hai creato una migration per correggere questo problema. Ora devi mandarla in esecuzione con il comando Update-Database e così lo schema del database verrà aggiornato.
(Non ho capito però se il database l'hai creato tu a mano o se lo lasci creare/aggiornare alle migrations).


Il database lo lascio completamente gestire alle migrations.
Nonostante gli abbia dato il comando "Update-Database" continua, invece che eliminarmi i record, a lasciarmelo mettendo la foreign key a NULL.
Non capisco perchè...

EF Code First è veramente potente ma su alcune cose ti fa perdere un sacco di tempo ed è complicato capire risalire al perchè..
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


Nonostante gli abbia dato il comando "Update-Database" continua, invece che eliminarmi i record, a lasciarmelo mettendo la foreign key a NULL.

Dev'essere che la colonna su cui c'è la foreign key è ancora nullable.
Infatti, una colonna non-nullable non potrebbe fisicamente ammettere valori null.


Prova ad essere esplicito sulla foreign key. Al momento l'hai omessa dal mapping.

modelBuilder.Entity<Model.Dossier.Option>()
.HasMany(x => x.OptionsPossibleValues)
.WithRequired()
.HasForeignKey(opv => opv.OptionId)
.WillCascadeOnDelete(true);


Dove OptionId è una proprietà di tipo int (quindi non-nullable) da creare nella classe OptionsPossibleValue, che è l'entità dipendente.

Fai di nuovo Add-Migration e Update-Database. Se vedi che non funziona ancora, fai tornare il database ad una migration precedente a quella che hai postato.
Update-Database -TargetMigration NomeMigrazionePrecedente

Poi elimina i file .cs delle successive migrations e ridai di nuovo Add-Migration per aggiugere tutte le modifiche allo schema che riguardano questa relazione.


EF Code First è veramente potente ma su alcune cose ti fa perdere un sacco di tempo ed è complicato capire risalire al perchè..

E' uno strumento guidato da convenzioni quindi ci vuole un po' di tempo per digerirle. EF per me è stato anche uno strumento formativo che mi ha fatto rendere conto che, quando mettevo mano al db, non realizzavo alcuni tipi di relazione con il dovuto rigore.

ciao,
Moreno
Modificato da BrightSoul il 13 agosto 2016 09.43 -

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.