wake-up-neo.net

Wie stellen Sie sicher, dass Cascade Delete zuerst für eine Tabellenbeziehung in EF Code aktiviert ist?

Ich möchte CASCADE DELETE für eine Tabelle mit Code-First aktivieren. Wenn das Modell von Grund auf neu erstellt wird, ist kein CASCADE DELETE festgelegt, obwohl die Beziehungen automatisch eingerichtet werden. Das Seltsame ist, dass es dies für einige Tabellen mit einer Beziehung von vielen zu vielen ermöglicht, von denen Sie denken, dass es Probleme mit ihnen geben könnte.

Setup: Tabelle A <- Tabelle B.

Die FK von Tabelle B zeigt auf die PK von Tabelle A.

Warum sollte das nicht funktionieren?

26
jaffa

Möglicherweise werden Sie nicht kaskadiert löschen, weil Ihre Beziehung optional ist. Beispiel:

public class Category
{
    public int CategoryId { get; set; }
}

public class Product
{
    public int ProductId { get; set; }
    public Category Category { get; set; }
}

In diesem Modell würden Sie eine Product-Tabelle mit einem Fremdschlüssel für die Category-Tabelle erhalten, die jedoch nullwertfähig ist und standardmäßig keine kaskadierenden Löscheinstellungen in der Datenbank enthalten.

Wenn Sie die Beziehung benötigen, haben Sie zwei Möglichkeiten:

Anmerkungen:

public class Product
{
    public int ProductId { get; set; }
    [Required]
    public Category Category { get; set; }
}

Fließende API:

modelBuilder.Entity<Product>()
            .HasRequired(p => p.Category)
            .WithMany();

In beiden Fällen wird das kaskadierende Löschen automatisch konfiguriert.

Wenn Sie die Beziehung optional haben möchten, aber WITH cascading delete , müssen Sie dies explizit konfigurieren:

modelBuilder.Entity<Product>()
            .HasOptional(p => p.Category)
            .WithMany()
            .WillCascadeOnDelete(true);

Bearbeiten: Im letzten Code-Snippet können Sie auch einfach .WillCascadeOnDelete() schreiben. Diese parameterlose Überladung ist standardmäßig auf true eingestellt, um das kaskadierende Löschen einzurichten.

Mehr dazu in der Dokumentation

54
Slauma
modelBuilder
.Entity<Product>()
.HasRequired(p => p.Category)
.WithMany(x => x.Products)
.WillCascadeOnDelete(true);
0