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_StageId
se ha agregado a Cards
(como se esperaba / desea), sin embargo, no Sides
contiene 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 StageId
columna agregada a mi Side
tabla.
Esto está funcionando, pero ahora en toda mi aplicación, cualquier referencia a Stage
contiene un SideId
, que en algunos casos es totalmente irrelevante. Me gustaría darles a mis Card
y Side
entidades una Stage
propiedad basada en la clase Stage anterior sin contaminar la clase stage con propiedades de referencia si es posible ... ¿qué estoy haciendo mal?
DeleteBehavior.Restrict
o DeleteBehavior.SetNull
.
Side
clase agregue un entero anulable y elimine el[Required]
atributo =>public int? CardId { get; set; }