Estou lutando com isso há um tempo e não consigo entender o que está acontecendo. Eu tenho uma entidade de cartão que contém lados (geralmente 2) - e ambos os cartões e lados têm um estágio. Estou usando as migrações EF Codefirst e as migrações estão falhando com este erro:
A introdução da restrição FOREIGN KEY 'FK_dbo.Sides_dbo.Cards_CardId' na tabela 'Lados' pode causar ciclos ou vários caminhos em cascata. Especifique ON DELETE NO ACTION ou ON UPDATE NO ACTION ou modifique outras restrições de FOREIGN KEY.
Aqui está a entidade do meu cartão :
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; }
}
Aqui está minha entidade Side :
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; }
}
E aqui está minha entidade 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; } }
}
O que é estranho é que se eu adicionar o seguinte à minha classe Stage:
public int? SideId { get; set; }
[ForeignKey("SideId")]
public virtual Side Side { get; set; }
A migração é executada com sucesso. Se eu abrir o SSMS e olhar para as tabelas, posso ver que Stage_StageId
foi adicionado a Cards
(como esperado / desejado), mas Sides
não contém nenhuma referência a Stage
(não esperado).
Se eu adicionar
[Required]
[ForeignKey("StageId")]
public virtual Stage Stage { get; set; }
public int StageId { get; set; }
Na minha classe Side, vejo a StageId
coluna adicionada à minha Side
tabela.
Isso está funcionando, mas agora, em toda a minha aplicação, qualquer referência a Stage
contém a SideId
, que em alguns casos é totalmente irrelevante. Eu gostaria de apenas dar às minhas entidades Card
e Side
uma Stage
propriedade com base na classe Stage acima sem poluir a classe stage com propriedades de referência, se possível ... o que estou fazendo de errado?
DeleteBehavior.Restrict
ou DeleteBehavior.SetNull
.
Side
Class, inclua número inteiro nulo e remova o[Required]
atributo =>public int? CardId { get; set; }