Bir süredir bununla güreşiyorum ve neler olduğunu tam olarak anlayamıyorum. Taraflar (genellikle 2) içeren bir Kart varlığım var ve hem Kartların hem de Tarafların bir Sahne Alanı var. EF Codefirst geçişlerini kullanıyorum ve geçişler bu hatayla başarısız oluyor:
'Taraflar' tablosundaki 'FK_dbo.Sides_dbo.Cards_CardId' FOREIGN KEY kısıtlamasına giriş, döngülere veya çoklu basamaklı yollara neden olabilir. AÇIK SİLME EYLEMİ SİLME veya GÜNCELLEŞTİRME EYLEMİ YOK belirtin veya diğer YABANCI TUŞ kısıtlamalarını değiştirin.
İşte Kart varlığım:
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; }
}
İşte benim Side varlığım:
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; }
}
Ve işte Sahne varlığım:
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; } }
}
Garip olan şey, Stage sınıfıma aşağıdakileri eklersem:
public int? SideId { get; set; }
[ForeignKey("SideId")]
public virtual Side Side { get; set; }
Taşıma başarıyla çalışır. SSMS'yi açar ve tablolara bakarsam, bunun Stage_StageId
eklendiğini Cards
(beklendiği / istendiği gibi) görebilirim, ancak (beklenmeyen) Sides
referans içermez Stage
.
Eğer eklersem
[Required]
[ForeignKey("StageId")]
public virtual Stage Stage { get; set; }
public int StageId { get; set; }
Side sınıfıma, StageId
tabloma eklenen sütunu görüyorum Side
.
Bu çalışıyor, ama şimdi benim uygulama boyunca, herhangi bir referans Stage
bir içerdiği SideId
bazı durumlarda tamamen ilgisiz olan. Sadece vermek istiyorum Card
ve Side
kuruluşlar bir Stage
referans özelliklerine mümkünse sahne sınıfını kirletmeden Sahne yukarıdaki sınıfını esas özelliği ... Ben yanlış yapıyorum?
DeleteBehavior.Restrict
veya ile basamaklı silmeyi devre dışı bırakmalısınız DeleteBehavior.SetNull
.
Side
[Required]
public int? CardId { get; set; }