Sto usando efcore 2.0.1.
Ho un modello:
public class BigAwesomeDinosaurWithTeeth
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public ICollection<YummyPunyPrey> YummyPunyPrey { get; set; }
}
public class YummyPunyPrey
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public Guid? BigAwesomeDinosaurWithTeethId { get; set; }
[ForeignKey("BigAwesomeDinosaurWithTeethId")]
public BigAwesomeDinosaurWithTeeth BigAwesomeDinosaurWithTeeth { get; set; }
}
Non ho api fluenti su queste due classi. Ma quando genero una migrazione
constraints: table =>
{
table.PrimaryKey("PK_YummyPunyPrey", x => x.Id);
table.ForeignKey(
name: "FK_YummyPunyPrey_BigAwesomeDinosaurWithTeeth_BigAwesomeDinosaurWithTeethId",
column: x => x.BigAwesomeDinosaurWithTeethId,
principalTable: "BigAwesomeDinosaurWithTeeth",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
});
Perché sta generando onDelete: ReferentialAction.Restrict quando la documentazione dice che dovrebbe gestirlo come ClientSetNull
https://docs.microsoft.com/en-us/ef/core/saving/cascade-delete
Nome del comportamento | Effetto su dipendente / figlio in memoria | Effetto su database dipendente / figlio
ClientSetNull (predefinito) | Le proprietà della chiave esterna sono impostate su null | Nessuna
Cambiamenti in EF Core 2.0: nelle versioni precedenti, Restrict faceva sì che le proprietà facoltative della chiave esterna nelle entità dipendenti rilevate fossero impostate su null ed era il comportamento di eliminazione predefinito per le relazioni facoltative. In EF Core 2.0, ClientSetNull è stato introdotto per rappresentare tale comportamento ed è diventato l'impostazione predefinita per le relazioni opzionali. Il comportamento di Restrict è stato adattato per non avere mai effetti collaterali sulle entità dipendenti.
Qualsiasi aiuto sul perché questo sta accadendo sarebbe molto apprezzato.
I metadati e le migrazioni di EF Core 2.0.1 utilizzano enumerazioni diverse per specificare il comportamento DeleteBehavior
rispettivamente DeleteBehavior
e ReferentialAction
. Mentre il primo è ben documentato, il secondo e la mappatura tra i due non è (al momento della scrittura).
Ecco la mappatura corrente:
DeleteBehavior ReferentialAction
============== =================
Cascade Cascade
ClientSetNull Restrict
Restrict Restrict
SetNull SetNull
Nel tuo caso, la relazione è facoltativa , quindi DeleteBehavior
by convention è ClientSetNull
che esegue la mappatura su onDelete: Restrict
, o in altre parole, FK forzato (abilitato) senza eliminazione a cascata.
Se vuoi un comportamento diverso, devi usare API fluente, ad es
modelBuilder.Entity<BigAwesomeDinosaurWithTeeth>()
.HasMany(e => e.YummyPunyPrey)
.WithOne(e => e.BigAwesomeDinosaurWithTeeth)
.OnDelete(DeleteBehavior.SetNull); // or whatever you like