He estado luchando con esto por un tiempo y no puedo entender qué está sucediendo. Tengo una entidad de tarjeta que contiene lados (generalmente 2), y tanto las cartas como los lados tienen un escenario. Estoy usando migraciones EF Codefirst y las migraciones fallan con este error:
La introducción de la restricción FOREIGN KEY 'FK_dbo.Sides_dbo.Cards_CardId' en la tabla 'Sides' puede causar ciclos o múltiples rutas en cascada. Especifique ON DELETE NO ACTION o ON UPDATE NO ACTION, o modifique otras restricciones de FOREIGN KEY.
Aquí está mi entidad de tarjeta :
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; }
}
Aquí está mi entidad secundaria :
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; }
}
Y aquí está mi entidad Stage :
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; } }
}
Lo extraño es que si agrego lo siguiente a mi clase Stage:
public int? SideId { get; set; }
[ForeignKey("SideId")]
public virtual Side Side { get; set; }
La migración se ejecuta con éxito. Si abro SSMS y miro las tablas, puedo ver que Stage_StageIdse ha agregado a Cards(como se esperaba / desea), sin embargo, no Sidescontiene ninguna referencia a Stage(no se espera).
Si luego agrego
[Required]
[ForeignKey("StageId")]
public virtual Stage Stage { get; set; }
public int StageId { get; set; }
Para mi clase Side, veo una StageIdcolumna agregada a mi Sidetabla.
Esto está funcionando, pero ahora en toda mi aplicación, cualquier referencia a Stagecontiene un SideId, que en algunos casos es totalmente irrelevante. Me gustaría darles a mis Cardy Sideentidades una Stagepropiedad basada en la clase Stage anterior sin contaminar la clase stage con propiedades de referencia si es posible ... ¿qué estoy haciendo mal?
DeleteBehavior.Restricto DeleteBehavior.SetNull.
Sideclase agregue un entero anulable y elimine el[Required]atributo =>public int? CardId { get; set; }