Die Einführung der FOREIGN KEY-Einschränkung kann die Ursache Zyklen oder mehreren cascade-Wege - warum?
Ich ve wurde kämpfen mit diesem für eine Weile und kann nicht ganz herausfinden, was passiert ist. Ich habe eine Karte-Einheit, die enthält Seiten (in der Regel 2) - und beide Karten und die Seiten haben eine Bühne. Ich bin mit EF Codefirst Migration und die Migrationen sind nicht mit diesem Fehler:
Einführung FOREIGN KEY-Einschränkung 'FK_dbo.Sides_dbo.Cards_CardId' auf
Tabelle 'Seiten' verursachen Zyklen oder mehreren cascade-Pfade. Geben Sie AUF
DELETE NO ACTION oder ON UPDATE NO ACTION, oder ändern Sie andere FOREIGN KEY
- Einschränkungen.
Hier mein Karte Person:
public class Card
{
public Card()
{
Sides = new Collection<Side>();
Stage = Stage.ONE;
}
[Key]
[Required]
public virtual int CardId { get; set; }
[Required]
public virtual Stage Stage { get; set; }
[Required]
[ForeignKey("CardId")]
public virtual ICollection<Side> Sides { get; set; }
}
Hier mein Seite Person:
public class Side
{
public Side()
{
Stage = Stage.ONE;
}
[Key]
[Required]
public virtual int SideId { get; set; }
[Required]
public virtual Stage Stage { get; set; }
[Required]
public int CardId { get; set; }
[ForeignKey("CardId")]
public virtual Card Card { get; set; }
}
Und hier ist mein Bühne Person:
public class Stage
{
//Zero
public static readonly Stage ONE = new Stage(new TimeSpan(0, 0, 0), "ONE");
//Ten seconds
public static readonly Stage TWO = new Stage(new TimeSpan(0, 0, 10), "TWO");
public static IEnumerable<Stage> Values
{
get
{
yield return ONE;
yield return TWO;
}
}
public int StageId { get; set; }
private readonly TimeSpan span;
public string Title { get; set; }
Stage(TimeSpan span, string title)
{
this.span = span;
this.Title = title;
}
public TimeSpan Span { get { return span; } }
}
Was seltsam ist, dass, wenn ich, fügen Sie den folgenden zu meinem Stage-Klasse:
public int? SideId { get; set; }
[ForeignKey("SideId")]
public virtual Side Side { get; set; }
Die migration erfolgreich ausgeführt wurde. Wenn ich mich öffne SSMS und Blick auf die Tabellen kann ich sehen, dass Stage_StageId
wurde Hinzugefügt Cards
(wie erwartet/gewünscht), jedoch Sides
enthält keinen Verweis auf Stage
(nicht erwartet).
Wenn ich dann hinzufügen
[Required]
[ForeignKey("StageId")]
public virtual Stage Stage { get; set; }
public int StageId { get; set; }
Meiner Seite Klasse, ich sehe StageId
Spalte Hinzugefügt, um meine Side
Tabelle.
Ist dies funktioniert, aber jetzt in meiner gesamten Applikation, jede Bezugnahme auf Stage
enthält eine SideId
, die in einigen Fällen völlig irrelevant. Ich möchte nur meine Card
und Side
Entitäten eine Stage
- Eigenschaft basierend auf den oben genannten Stage-Klasse ohne das verschmutzen der stage-Klasse mit Referenz-Eigenschaften, wenn möglich... was mache ich falsch?
Side
Klasse hinzufügen Nullable-integer und entfernen [Required]
Attribut => public int? CardId { get; set; }
In der EF-Core, sollten Sie deaktivieren Löschweitergabe mit
DeleteBehavior.Restrict
oder DeleteBehavior.SetNull
.
InformationsquelleAutor SB2055 | 2013-06-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil
Stage
ist erforderlich, alle eins-zu-viele-Beziehungen, woStage
beteiligt ist, werden die kaskadierenden löschen standardmäßig aktiviert. Es bedeutet, dass, wenn Sie löschen einStage
PersonSide
Card
und weilCard
undSide
haben eine geforderte eins-zu-viele-Beziehung mit Löschweitergabe aktiviert standardmäßig wieder wird es dann Kaskade vonCard
zuSide
Also, Sie haben zwei kaskadierende löschen von Pfaden aus
Stage
zuSide
- die die Ausnahme verursacht.Müssen Sie entweder die
Stage
optional in mindestens eine von den Entitäten (D. H. entfernen der[Required]
Attribut aus derStage
Eigenschaften) oder deaktivieren cascading delete mit der Fluent-API (nicht möglich bei den Daten Anmerkungen):Ja, es betrifft nur die Beziehungen von
Stage
. Andere Beziehungen bleiben unverändert.Gibt es eine Möglichkeit zu wissen, welche Eigenschaften werden den Fehler verursacht? Ich habe das gleiche problem, und ein Blick auf meine Klassen, ich kann nicht sehen, wo ist der Zyklus
Ist dies eine Einschränkung in der Umsetzung? Scheint in Ordnung für mich für ein
Stage
Löschung zu stürzen, umSide
sowohl direkt als auch über einCard
Nehmen wir an, wir setzen CascadeOnDelete auf false. Dann entfernten wir eine Bühne aufzeichnen, die im Zusammenhang mit einer von der Karte Datensätze. Was passiert um Card.Bühne (FK)? Tut es gleich bleiben? oder ist es auf Null gesetzt?
InformationsquelleAutor Slauma
Hatte ich eine Tabelle, die eine zirkuläre Beziehung mit anderen und ich war immer die gleichen Fehler. Stellt sich heraus, es ist über die Fremdschlüssel, die nicht null-Werte zulassen. Wenn key null ist nicht zulässig zugehörige Objekt gelöscht werden müssen und kreisförmige Beziehungen nicht erlaubt. So verwenden Sie null-Werte zulässt Fremdschlüssel.
int?
stattint
zu lassen, werden null-Werte zu.Ich habe versucht, viele verschiedene Möglichkeiten zum ausschalten der cascade löschen und nichts ging mehr - das es behoben!
Sie sollten nicht tun, wenn Sie nicht zulassen möchten, dass die Bühne auf null zu setzen (die Bühne war ein erforderliches Feld in der ursprünglichen Frage).
InformationsquelleAutor Cem Mutlu
Jemand Fragen, wie es in EF Kern:
Alternativ
builder.HasOne(x => x.Stage).WithMany().HasForeignKey(x => x.StageId).OnDelete(DeleteBehavior.Restrict);
InformationsquelleAutor Nexus23
Wurde ich immer diese Fehlermeldung für viele Personen, wenn ich war die Migration von EF7-Modell zu einer EF6-version. Ich wollte nicht müssen gehen durch jeder Person ein zu einer Zeit, so dass ich verwendet:
Dieser arbeitete für mich; .NETTO 4.7, EF 6. Ein Stolperstein war, bekam ich den Fehler, also wenn ich regeneriert von Migrations-Skript mit diesen Konventionen entfernt, es didn ' T SCHEINEN zu helfen. Ausführen des "Add-Migration" mit "-Force" deaktiviert es alle, und wieder aufgebaut, darunter auch diese Konventionen vor. Problem gelöst...
InformationsquelleAutor Sean
Können Sie festlegen, cascadeDelete auf false oder true (bei einer migration von Bis () - Methode). Hängt von Ihrer Anforderung.
Nur vergessen Sie nicht, der
UP
Methode kann modifiziert werden durch externe Vorgänge.InformationsquelleAutor Musakkhir Sayyed
Ich hatte dieses Problem auch, ich löste es sofort mit diese Antwort aus einem ähnlichen thread
In meinem Fall, ich wollte Sie nicht löschen Sie die abhängigen Satz auf Schlüssel löschen. Wenn dies der Fall ist, in Ihrer situation, so ändern Sie einfach den Boolean-Wert in der migration auf false:
Chancen sind, wenn Sie erstellen die Beziehungen, die werfen diese compiler-Fehler, aber TUN pflegen wollen cascade löschen; Sie haben ein Problem mit Ihren Beziehungen.
InformationsquelleAutor jonc.js
In .NET-Core-I-verändert die "onDelete" - option, um ReferencialAction.NoAction
InformationsquelleAutor Mike Jones
Ich behoben. Wenn Sie hinzufügen, die migration, in der Up () - Methode gibt es eine Zeile wie diese:
Wenn Sie löschen Sie einfach die cascadeDelete aus dem Ende wird es funktionieren.
InformationsquelleAutor Usman Khan
Nur für die Dokumentation Zweck, dass jemand kommt, auf die Zukunft, diese Sache gelöst werden kann, so einfach wie dieser, und mit dieser Methode konnten Sie eine Methode, mit der die Behinderten eine Zeit, und Sie können Ihre Methode in der Regel
Fügen Sie diese Methode, um die Kontext-Datenbank-Klasse:
InformationsquelleAutor sgrysoft
Das klingt komisch und ich weiß nicht warum, aber in meinem Fall, was passiert war, weil mein ConnectionString, war die Verwendung von "." in "Daten Quelle" - Attribut. Sobald ich es geändert auf "localhost" es workded wie ein Charme. Keine anderen änderungen erforderlich waren.
InformationsquelleAutor Marco Alves
Den vorhandenen Antworten sind toll ich wollte nur hinzufügen, dass ich lief in dieser Fehler aus einem anderen Grund. Ich wollte eine Erste EF-migration auf eine vorhandene DB, aber ich habe nicht den -IgnoreChanges Flagge und das Update-Database-Befehl auf eine leere Datenbank (auch auf die bestehenden fehlschlägt).
Stattdessen musste ich diesen Befehl ausführen, wenn die aktuelle db-Struktur ist die aktuelle:
Es ist wahrscheinlich ein echtes problem in der db-Struktur, aber die Welt retten, einen Schritt zu einer Zeit,...
InformationsquelleAutor CodingYourLife
In .NET Core ich spielte mit allen oberen Antworten - aber ohne Erfolg.
Ich machte viel ändert in der DB-Struktur und jedes mal, wenn neue migration Versuch
update-database
, erhielt aber den gleichen Fehler.Dann begann ich zu
remove-migration
eins nach dem anderen, bis Paket-Manager-Konsole warf mir Ausnahme:Danach habe ich die neue migration (
add-migration
) undupdate-database
erfolgreichAlso mein Vorschlag wäre: löschen Sie alle Ihre temp-Migrationen, bis deine aktuelle DB-Zustand.
InformationsquelleAutor rock_walker
Keiner der oben genannten Lösungen bei mir funktioniert. Was ich zu tun hatte war, verwenden Sie eine null-int (int?) auf der Fremdschlüssel, der nicht notwendig war (oder auch nicht eine not null-Spalte-Taste) und löschen Sie dann einige meiner Migrationen.
Starten Sie durch das löschen der Migration, dann versuchen Sie die nullable int.
Problem war eine änderung und-Modell-design. Keine code-änderung notwendig war.
InformationsquelleAutor Ayson Baxter