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?

Deaktivieren kaskadierenden löschen, indem null-Werte in den Referenzen... so in 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

Schreibe einen Kommentar