Ich habe eine Weile damit gerungen und kann nicht genau herausfinden, was passiert. Ich habe eine Kartenentität, die Seiten enthält (normalerweise 2) - und sowohl Karten als auch Seiten haben eine Stufe. Ich verwende EF Codefirst-Migrationen und die Migrationen schlagen mit diesem Fehler fehl:
Die Einführung der FOREIGN KEY-Einschränkung 'FK_dbo.Sides_dbo.Cards_CardId' in der Tabelle 'Sides' 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.
Hier ist meine Karte Einheit:
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 ist meine Side Einheit:
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 meine Bühnenentität :
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, ist, wenn ich meiner Stage-Klasse Folgendes hinzufüge:
public int? SideId { get; set; }
[ForeignKey("SideId")]
public virtual Side Side { get; set; }
Die Migration wird erfolgreich ausgeführt. Wenn ich SSMS öffne und mir die Tabellen ansehe, kann ich sehen, dass Stage_StageId
das hinzugefügt wurde Cards
(wie erwartet / gewünscht), Sides
enthält jedoch keinen Verweis aufStage
(nicht erwartet) enthält.
Wenn ich dann hinzufüge
[Required]
[ForeignKey("StageId")]
public virtual Stage Stage { get; set; }
public int StageId { get; set; }
In meiner Nebenklasse wird eine StageId
Spalte zu meiner hinzugefügtSide
Tabelle .
Dies funktioniert, aber jetzt in meiner gesamten Anwendung Stage
enthält jeder Verweis auf a SideId
, was in einigen Fällen völlig irrelevant ist. Ich möchte meinen Card
und Side
Entitäten einfach eine Stage
Eigenschaft geben, die auf der obigen Stage-Klasse basiert, ohne die Stage-Klasse nach Möglichkeit mit Referenzeigenschaften zu verschmutzen ... was mache ich falsch?
DeleteBehavior.Restrict
oder deaktivieren DeleteBehavior.SetNull
.
Side
zulassen. Fügen Sie also in Class eine Nullable-Ganzzahl hinzu und entfernen Sie das[Required]
Attribut =>public int? CardId { get; set; }