25

Kod ilk önce bir tabloda CASCADE DELETE özelliğini etkinleştirmek istiyorum. Model sıfırdan yeniden oluşturulduğunda, ilişkiler otomatik olarak ayarlanmış olsa bile CASCADE DELETE ayarlanmamıştır. Garip olan şey, bunun birçok tabloya sahip olsa da, bununla ilgili sorun yaşayabileceğini düşündüğünüz bazı tablolar için bunu etkinleştirmesidir.İlk önce EF Kodu'ndaki Tablo ilişkilerinde Cascade Delete'in etkin olmasını nasıl sağlıyorsunuz?

Ayar: Tablo A < - Tablo B Tablo A'nın PK

Tablo B FK işaret eder.

Bu neden çalışmıyor?

+1

bu konuyu daha bakın? Bu durumda, cascade silmeleri "OneToManyCascadeDeleteConvention" tarafından oluşturulmalıdır. –

+1

@Ladislav: Bu genel "varlık-çerçeve" etiketini kaldırmak güzel mi? Bu sorunun neden en sevdiğim etiketlerimin altındaki sorulardan aniden kaybolduğunu merak ediyordum. Şimdi varlık-çerçeve-4.1 've' varlık-çerçeve-4 've ... ve ...' yi ekledim, ancak şu anda tüm bu etiketleri kontrol etmek için biraz sarsılmış oluyor. Bir soru üzerinde giderek uzmanlaşmış bir etiketleme hiyerarşisine sahip olmanın daha iyi olamayacağından emin değilim. Daha az okuyucunun soruları sadece soruların ilgisi olmayan çok özel etiketlerle görebileceği bir risk görüyorum. – Slauma

+1

@Slauma: Hem katılıyorum hem de EF 4 ve EF 4.1 etiketlerini kapatma konusunda ısrar edeceğiz ve sadece EF etiketini kullanacağız (ki bu doğru bir şeydir) veya içeriğine bağlı olarak soruları etiketleyeceğiz. Bu konu hakkında meta ile ilgili soruyu yakında açacağım, çünkü EF etiketleriyle ilgili daha fazla sorun var. –

cevap

53

Basamaklı silme yapmamanın olası nedeni, ilişkinizin isteğe bağlı olmasıdır. Örnek:

Bu modelde
public class Category 
{ 
    public int CategoryId { get; set; } 
} 

public class Product 
{ 
    public int ProductId { get; set; } 
    public Category Category { get; set; } 
} 

Eğer Kategori tablosuna bir yabancı anahtar vardır Ürün tablo alacağı ancak bu anahtar null ve hiçbir basamaklı varsayılan olarak veritabanında kurulumunu silmek yoktur. otomatik yapılandırılacaktır silmek basamaklı iki durumda da

modelBuilder.Entity<Product>() 
      .HasRequired(p => p.Category) 
      .WithMany(); 

:

Ek Açıklamalar:

public class Product 
{ 
    public int ProductId { get; set; } 
    [Required] 
    public Category Category { get; set; } 
} 

Akıcı API ilişki ardından gerekli olmasını istiyorsanız

iki seçeneğiniz var . Eğer isteğe bağlıdır ancak silmek kaskatlama İLE ilişki istiyorsanız

siz açık bir şekilde bu yapılandırmanız gerekir:

modelBuilder.Entity<Product>() 
      .HasOptional(p => p.Category) 
      .WithMany() 
      .WillCascadeOnDelete(true); 

Edit: Geçen kodunda da basitçe .WillCascadeOnDelete() yazabilir pasajı. Bu parametresiz aşırı yük, basamaklı silme ayarlamak için varsayılan olarak true.

FK gerekli mi (non-null) documentation

+0

Bu, sözleşmeyi belirtmezseniz, WillCascadeOnDelete() varsayılan olarak kapalı mı? – jaffa

+3

@Jon: Hayır, CascadeOnDelete genellikle kapalı değildir. Kongre şu şekildedir: İlişki/navigasyon özelliğinizin "gerekli" olması durumunda (= yabancı anahtar/referansın boş olması yasaktır) açık. Ancak ilişkiniz/gezintiniz "isteğe bağlı" ise kapalıdır (= yabancı anahtar/referansın boş olmasına izin verilir). Her iki durumda da sözleşmenin üzerine yazabilirsiniz: Gerekli bir gezinme özelliği için basamaklı silme özelliğini kapatabilir ve isteğe bağlı bir gezinme özelliği için bunu açabilirsiniz. Ayrıca "OneToManyCascadeDeleteConvention" öğesini de kapatabilirsiniz. Ardından, Fluent API'da istediğiniz şeyi belirtmeniz gerekir. – Slauma

+0

@Slauma Yabancı anahtarın ilk örneğinizde olduğu gibi null olmasaydı, ilişkilerin gerekli olduğu varsayıldığını okudum. Http://msdn.microsoft.com/en-us/data/jj679962.aspx – ajbeaven

0
modelBuilder 
.Entity<Product>() 
.HasRequired(p => p.Category) 
.WithMany(x => x.Products) 
.WillCascadeOnDelete(true); 
İlgili konular