Ausgabe
Ich versuche, einige Änderungen an einem EF-Modell vorzunehmen, und ich habe ein Problem mit kaskadierenden Löschvorgängen. Ich weiß, dass ich dies schon einmal getan habe, kann aber nicht finden, wo und kann keine Lösung finden, mit der ich zufrieden bin.
Dies ist ein Beispiel für das vorhandene Modell. Ich habe versucht, etwas Allgemeines zu verwenden, bei dem wir alle die realen Beziehungen zwischen (Schulen und Schülern/Lehrern) erkennen werden:
namespace Models
{
public class School
{
public guid Id { get; set; }
public string Name {get; set;}
public IList<Teacher> Teachers { get; set; }
}
public class Person
{
public guid Id { get; set; }
public string Name { get; set; }
public guid SchoolId SchoolId { get; set; }
public School School { get; set; }
public string TeachersUnionId { get; set; }
}
}
Dies gibt uns eine Schultabelle in der Datenbank mit einer Eins-zu-Viele-Beziehung zur Personentabelle.
Was wir tun möchten, ist, die Person weniger generisch zu machen und sie in Teacher-Objekte und Student-Objekte aufzuteilen.
Ich mache das so:
namespace Models
{
public class School
{
public guid Id { get; set; }
public string Name {get; set;}
}
public abstract class Person
{
public guid Id { get; set; }
public string Name { get; set; }
public guid SchoolId SchoolId { get; set; }
public School School { get; set; }
}
public class Teacher : Person
{
public string TeachersUnionId { get; set; }
}
public class Student : Person
{
public string StudentUnionId { get; set;}
}
}
Was uns in der DB die gleiche Struktur gibt, eine Schultabelle mit einer Eins-2-Viele auf der Personentabelle, aber die Personentabelle hat jetzt einen Diskriminator, sodass EF zwischen einem Schüler und einem Lehrer unterscheiden kann.
Das ist in Ordnung und funktioniert wie erwartet. Das Problem, das ich jetzt habe, ist, dass ich eine Navigationseigenschaft aus dem Schulobjekt zu den Schülern und Lehrern hinzufügen möchte.
Wir haben dies in zwei Schritten gemacht, Lehrer zuerst, also wird das Schulobjekt:
public class School
{
public guid Id { get; set; }
public string Name {get; set;}
public IList<Teacher> Teachers { get; set; }
}
Das funktioniert und ermöglicht es uns, von einer Schule bis hinunter zu einer Sammlung von Lehrern zu navigieren.
Jetzt möchten wir die Eigenschaft „Schülernavigation“ hinzufügen, also ändern wir das Schulobjekt so
public class School
{
public guid Id { get; set; }
public string Name {get; set;}
public IList<Teacher> Teachers { get; set; }
public IList<Student> Students { get; set; }
}
Aber wenn wir die Migration dafür anwenden, erhalten wir
Das Einführen der FOREIGN KEY-Einschränkung „FK_NAME“ in der Tabelle „Person“ kann zu Zyklen oder mehreren Kaskadenpfaden führen. Geben Sie ON DELETE NO ACTION oder ON UPDATE NO ACTION an oder ändern Sie andere FOREIGN KEY-Einschränkungen.
Normalerweise geht es mir mit EF gut – aber ich habe Mühe, mir klar zu machen, warum dies diesmal nicht funktioniert – wie gesagt, ich bin mir sicher, dass wir diese Struktur schon einmal verwendet haben.
Dies ist ein C#-Projekt, das .net 5 und Ef Core verwendet.
Irgendwelche Ideen?
Lösung
Sie können das gewünschte Löschverhalten explizit angeben, OnDelete(DeleteBehavior.ClientCascade)
indem Sie angeben
builder.HasOne(d => d.Prop1)
.WithMany(p => p.Prop2)
.HasForeignKey(d => d.Prop3)
.OnDelete(DeleteBehavior.ClientCascade)
.HasConstraintName("FK_Table1_Table2");
DeleteBehavior
Cascade
enum hat andere Optionen wie ClientSetNull
usw
Beantwortet von – WisdomSeeker
Antwort geprüft von – Mildred Charles (FixError Admin)