Ho il seguente codice in un, quello che sembra un futile, tentativo di configurare il comportamento OnDelete
per le chiavi esterne:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Contact>()
.HasOne(e => e.Gender)
.WithMany()
.HasForeignKey(e => e.GenderId)
.OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<Contact>()
.HasOne(e => e.Title)
.WithMany()
.HasForeignKey(e => e.TitleId)
.OnDelete(DeleteBehavior.Restrict);
}
Tuttavia, quando genero la prima migrazione, che crea questa e altre due tabelle, crea vincoli per Contact
come segue:
constraints: table =>
{
table.PrimaryKey("PK_Contact", x => x.Id);
table.ForeignKey(
name: "FK_Contact_Gender_GenderId",
column: x => x.GenderId,
principalTable: "Gender",
principalColumn: "Id",
onDelete: ReferentialAction.SetNull);
table.ForeignKey(
name: "FK_Contact_Title_TitleId",
column: x => x.TitleId,
principalTable: "Title",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
Dove SetNull
ottiene SetNull
, su una colonna non nullable, GenderId
? Cascade
è forse un valore predefinito, dopo aver ignorato la mia configurazione.
Come suggerito da @bricelam, ho inviato un problema e ho ottenuto una risposta corretta in meno di 24 ore. Smit Patel di Microsoft ha consigliato:
Nel
project.json
si fa riferimento aMicrosoft.EntityFrameworkCore.Commands
che è stato deprecato qualche tempo fa e dovrebbe essere rimosso.
L'ho rimosso e la migrazione rigenerata ora ha i valori onDelete
corretti per entrambi gli FK.