SORU
15 HAZİRAN 2013, CUMARTESİ


Tanıtımı YABANCI ANAHTAR kısıtlaması devir veya birden fazla ardarda yolları neden olabilir neden?

Bir süre için bu ile mücadele ettik ve oldukça neler olduğunu anlayabilmiş değilim. Taraf (genellikle 2) içeren Kart bir varlık var - ve her iki Kart ve iki Aşama var. EF Codefirst göçler kullanıyorum ve göçler bu hata ile başarısız:

Tanıtımı YABANCI ANAHTAR kısıtlaması 'FK_dbo.Sides_dbo.'Cards_Cardİd 'Taraf' devir veya birden fazla ardarda yolları neden olabilir. tablo Belirtin SİLMEK herhangi bir EYLEM veya EYLEM YOK, UPDATE veya başka bir YABANCI ANAHTAR değiştirme kısıtlamaları.

İşte benimKartıvarlık:

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 benimYanvarlık:

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 benimSahnevarlık:

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; } }
}

Tuhaf olan şey ise Sahne benim sınıf için: aşağıdaki eklersem

    public int? SideId { get; set; }
    [ForeignKey("SideId")]
    public virtual Side Side { get; set; }

Geçiş başarılı bir şekilde çalışır. Eğer ben aç SSMS ve bak tabloları görebiliyorum Stage_StageId eklendi Cards (beklenen/istenen), ancak Sides içeren bir başvuru için Stage (beklenen).

Ben daha sonra ekleyin

    [Required]
    [ForeignKey("StageId")]
    public virtual Stage Stage { get; set; }
    public int StageId { get; set; }

Benim Yan sınıf, StageId sütun Side benim tabloya eklenen görüyorum.

Bu çalışıyor, ama şimdi benim uygulama boyunca, 17* *herhangi bir referans bazı durumlarda olan SideId tamamen alakasız içerir.Sadece Card Side benim varlıklar Stage bir özellik yukarıdaki Sahne sınıfına göre vermek mümkünse referans özellikleri ile sahne sınıf kirletmeden istiyorum... benim yaptığım yanlış?

CEVAP
15 HAZİRAN 2013, CUMARTESİ


Stage çünkügerekli-çok Stage söz konusu olduğu ilişkiler silmek basamaklı olacak varsayılan olarak etkin. Eğer Stage varlık silmek anlamına geliyor

  • sil direk 25 ** cascade
  • bu silecek cascade doğrudan Card Card Side olması gereken bir-çok ilişki ile basamaklı sil etkin varsayılan olarak daha sonra ardarda gelen Card Side

Peki, bu durum neden Side Stage iki basamaklı silme yolları var.

Gerekir de Stage isteğe bağlı olarak en az bir varlık (yani Kaldır [Required] öznitelik Stage özellikler) veya devre dışı bırakmak geçişli silme ile Akıcı API (mümkün olan veri ek açıklamalar):

modelBuilder.Entity<Card>()
    .HasRequired(c => c.Stage)
    .WithMany()
    .WillCascadeOnDelete(false);

modelBuilder.Entity<Side>()
    .HasRequired(s => s.Stage)
    .WithMany()
    .WillCascadeOnDelete(false);

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ash100HD

    Ash100HD

    29 EKİM 2011
  • buttheadgsxr1000

    buttheadgsxr

    24 Ocak 2008
  • hidetake takayama

    hidetake tak

    3 Mart 2009