2012-01-30 27 views
5

Northwind örnek veritabanını kullanıyorum. basamaklı siler ile, Sipariş Ayrıntıları - Entity Framework Basamaklı Siler ve Tembel Yükleme

  • var db = new NorthwindEntities(); 
    int id = 2; // Example 
    var delObject = (from o in db.Orders.Include("Order_Details") 
           where o.OrderID == id 
           select o).First(); 
    db.Orders.DeleteObject(delObject); 
    db.SaveChanges(); 
    
    ben Order bir (1 çoğa) ilişkilendirmesi: Bu kodu vardır. (Bir Siparişi silersem, aynı OrderID'ye sahip tüm Order_Details silinir).

  • LazyYükleniyor etkin.

ben fıkra dan .Include("Order_Details") silerseniz çağlayan çalışmaz silin.

Bu neden oluyor? Tembel başlatma benim için Order_Details "içerir" ve sonunda bana cascade silmeyi izin değil mi?

+0

Nope. Benim deneyimime göre basamaklı silme sadece bellek nesnelerinde geçerlidir. – cadrell0

cevap

5

Basamaklı silme, EF modelinizde tanımlanmıştır. Bu nedenle, yüklediği veriler için silme ifadeleri oluşturacaktır. EF, neleri silmesi gerektiğini kontrol etmek için veritabanına gitmeyecektir.

Veritabanı düzeyinde basamaklı silmeleri (veritabanınıza bağlı olarak) tanımlayabilirsiniz. Bu durumda EF, üst düğümü siler ve veritabanı ilgili satırları siler.

1

Hem veritabanı hem de varlık yapılandırmasında tanımlanan basamaklı silme var mı? Bunu sadece bir tanesinde nerede tanımladığını gördüm, diğeri de bu soruna neden olabilir.

+0

Gerçekten, bu işe yaradı, ama bu neden oluyor? – ColdFusion

1

EF modelindeki kaskad silme işlemleri yalnızca bağlamda yüklenen ayrıntıları siler. Eğer Sipariş İçerisini Kullan komutunu kullanırsanız, Siparişler ile birlikte sorgulama sırasında Kuyruklar yüklenir. LazyLoading özelliğini etkinleştirdiyseniz ve Include özelliğini kullanmıyorsanız, bunlar gerektiği gibi, yani navigasyon özelliklerini referansladığınızda yüklenir. Bu nedenle, ayrıntıları önemsemiyorsanız ve sessiz bir şekilde ana kayıtla silineceklerini kabul ederseniz, hem EF modelinde hem de DB şemasında kaskad silinmesini tanımlamanız gerekir.