[EF Core] Entity Framework Core - OnDelete FK - NULL Problem - Lösch Verhalten

    • Offizieller Beitrag

    Da ich jetzt des Öfteren auf das Problem gestoßen bin das immer mehr DB Leichen generiert wurden in dem Bereich beim Löschen von Entitys die Verknüpfungen erhielten werde ich hier nun einmal eine Lösung aufzeigen die das Problem bei mir Gelöst hat.


    Ein kleines Beispiel zu dem Model


    Ich habe eine Abstract Class die ich für all meine Datenbank Modelle nutze



    Ein Beispiel Model mit einer Verknüpfung zu einem Anderen Model "foreign keys"


    C#: Person.cs
        public class Person : DbModel
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public virtual List<PersonalItems> Items { get; set; } // Erstellt in dem Model PersonalItems den FK
        }

    Constructor lassen wir mal weg sollte ja bekannt sein.


    C#: PersonalItems.cs
        public class PersonalItems : DbModel
        {
            public int ItemID { get; set; }
            public int Count { get; set; }
            //FK PersonId
        }


    Wenn ich nun Feststelle das eines der Items in der List den Count = 0 erreicht möchte ich das aus meiner DB entfernt haben. Das mache ich wie folgt.



    Alles schön alles gut doch in der Datenbank sieht es danach nicht so aus es Geschieht nur Folgendes und zwar das der FK Also die PersonId zu einer NULL wird und somit ist das "Entity" zwar Tot aber noch immer in der Datenbank.


    Um das Problem zu umgehen habe ich im meinem Context im Override von der Funktion OnModelCreating(ModelBuilder modelBuilder) eine Schleife eingebaut die den ForeignKeys die Meta Daten verändert und der Datenbank sagt wie sie sich zu verhalten hat beim Löschen.

    Das Manuelle Setzten in der Datenbank selbst Funktioniert leider nicht Wirklich.

    Aber genug gelabert hier die Lösung für das NULL Problem.


    C#: DatabaseContext.cs
            protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                foreach (var foreignKey in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
                {
                    foreignKey.DeleteBehavior = DeleteBehavior.Cascade;
                }
                base.OnModelCreating(modelBuilder);
            }


    Vielleicht Hilft es ja dem ein oder anderen EF Core Nutzer ebenfalls.


    Viel Spaß und Happy Coding

    BitDEVil2K16 :evil:

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!