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
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace RageServer.Server.Models
{
public abstract class DbModel
{
[Key] //Das Löst schon mal das ein oder andere Problem Affected Row(1) vs 0
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
}
}
Alles anzeigen
Ein Beispiel Model mit einer Verknüpfung zu einem Anderen Model "foreign keys"
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.
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.
//Funktion aufrufen
private void RemoveItem(MeinObject obj, int Id, int ItemId, int Count)
{
using(var context = new DatabaseContext())
{
var person = context.Person.Include(x => x.Items).FirstOrDefault(y => y.Id == Id);
if (person != null){
var item = person.Items.FirstOrDefault(x => x.Id == ItemId);
item.Count -= Count;
if (item.Count<=0){
person.Items.Remove(item);
}
context.SaveChanges();
}
}
}
Alles anzeigen
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.
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