Ich versuche, eine vorhandene Datenbank mit Entity Framework Code First Fluent API zuzuordnen. Ich kämpfe in einer Situation mit einer Viele-zu-Viele-Beziehung und Kaskadenlöschung.So kaskadieren Sie das Löschen nur in der Join-Tabelle mit Entity Framework Code Erste Fluent-API
Hier ist meine zwei POCO Klassen:
public class Foo
{
public int FooId;
public string FooDescription;
public IList<Bar> Bars;
}
public class Bar
{
public int BarId;
public string BarDescription;
}
Vorerst ich nur eine Navigationseigenschaft von Foo
zu Bar
haben. Das liegt daran, dass es in meinem realen Szenario für niemanden sinnvoll ist, von Bar
zu Foo
zu gehen. Die Beziehung von Foo
zu Bar
ist eigentlich 0, was bedeutet, dass eine Instanz von Foo
keine Instanzen von Bar
erfordert.
Meine vorhandene Datenbank hat eine Join-Tabelle zwischen diesen beiden Tabellen. Diese Tabelle sieht wie folgt aus:
modelBuilder.Entity<Foo>()
.HasMany(t => t.Bars)
.WithMany()
.Map(m =>
{
m.ToTable("Foo_Bar");
m.MapLeftKey("FooId");
m.MapRightKey("BarId");
});
Das funktioniert perfekt für Einsätze:
create table Foo_Bar(
FooId int not null,
BarId int not null
);
Weil ich es vorziehen, nicht so ein POCO-Klasse in meinem Projekt zu erstellen, ich die Tabelle wie folgt zugeordnet. Entity einfügen auf Foo und dann auf der vorhandenen Foo_Bar
Tabelle.
Aber wenn ich eine Foo
löschen, möchte ich die Datensätze in der Join-Tabelle löschen, aber nicht in der untergeordneten Tabelle. Bedeutung Ich möchte Datensätze unter Foo_Bar
löschen, diese Kaskade jedoch nicht auf Bar
erweitern.
Ist eine solche Zuordnung möglich? Ich sollte erwähnen, dass ich in meinem Kontext sowohl OneToManyCascadeDeleteConvention
als auch ManyToManyCascadeDeleteConvention
entfernt habe, weil ich 99% der Zeiten nicht Kaskade löschen werde. Dies ist eine spezifische Situation.
Durch Verfolgen der SQL erzeugt durch Entity Framework Ich habe auch bemerkt, dass, wenn ich eine Foo
Instanz und stellen Sie alle Bars im Inneren zu EntityState.Deleted abrufen, EF beide Datensätze in Foo_Bar
löscht und Bar
. Eine letzte Sache, die ich erwähnen sollte, ist, dass ich in einem getrennten Szenario arbeite.
Ich habe versucht, dies zu durchsuchen, aber es scheint, dass ich nicht die richtigen Schlüsselwörter verwende, da ich niemanden in einer solchen Situation finden konnte. An diesem Punkt ist die einzige Lösung, die ich sehe, Map
eine FooBar
Klasse, aber ich hoffe, es gibt einen Weg, dies zu tun.
--edit
Es scheint, dass mein Ansatz war anfangs falsch zu löschen. Als ich versuchte, löschte ich nicht die Instanz Foo
mit seiner Liste von Bar
gefüllt. Nach dieser Änderung erstellt Entity Framwork eine Löschanweisung für jede Bar
in der Liste. Ich habe immer noch Probleme mit der Aktualisierung wie Hinzufügen und Entfernen von Elementen zur gleichen Zeit. Werde mehr Tests machen und hier posten.
Vielen Dank im Voraus.
Ich stimme dir zu. Es ist das einzig mögliche Mapping. Ich kann mich nicht erinnern, warum ich das angegeben habe, als ich es geschrieben habe. Bezüglich der Notwendigkeit, die Konvention zu entfernen, habe ich ein Szenario, bei dem ein Ende der Viele-zu-Viele-Beziehung eine Tabelle mit Datensätzen ist, die mit der Geschäftslogik verknüpft sind. Der Benutzer kann seine Datensätze nicht bearbeiten. Wenn Sie kein Kaskaden-Löschen an diesem Ende erstellen, auch wenn jemand versehentlich versucht, einen Datensatz zu löschen, wird nichts unterbrochen. Aber ich denke, das ist in der Tat eine Ausnahme. Für jetzt werde ich die Konvention aktivieren und die Ausnahmen auf andere Weise behandeln. Vielen Dank. –