2014-06-30 21 views
5

Entity Framework'e tamamen yeni geldim, bu yüzden mantığım çarpıksa lütfen beni affet/işler zaten işliyor, ama bir uygulama üzerinde çalışıyorum. :Entity Framework - Etkin Olmadan Tüm Çocuk Varlıkları Sil

  1. Ben Birincil anahtar ile bir tabloda Veli Bilgi depolamak = her ParentId için ParentId
  2. , ben parentId üzerinde bire birçok yabancı anahtar ilişkisi olan bir çocuğun tablosundaki kayıtları binlerce saklamak. bilgi zamankinden (oldukça sık oluyor olabilir) bir ebeveyn için değişirse

Yani, ne benim program var olduğunu yapmak ister eşdeğer gerçekleştirmeniz: çocuğu güncellemeden önce

DELETE FROM ChildTable WHERE ParentId = 'xx' 

Aynı ParentId için yeni/güncellenmiş değerler içeren tablo. Gördüğüm kadarıyla


, bunu yapacağını yoludur ya:

gerçek bir SQL komutu
  • koyun ctx.Database.ExecuteSqlCommand() tür kavram
  • bazı On seviyesini kullanarak , aslında çocuklar öğeleri aracılığıyla döngü ve DB bağlamını güncellemeden önce onları silmek için ayarlayın (ki ben bunu yapmak için tüm bunları yapmak için DB bunları çekti gerekir tahmin ediyorum çünkü büyük ölçüde verimsiz olurdu gibi görünüyor yapmak sadece hepsini silmek içindir. mümkün olan en verimli şekilde EF bunu yapmanın doğru yolu

nedir?

+0

Olası yinelenen http://stackoverflow.com/questions/2519866/how-do-i-delete-multiple-rows-in-entity-framework-without-foreach – Stilgar

+0

@Stilgar, bu işaret için teşekkürler, ben yaptım Bu soruya bakın, ama yine de şaşkınım (belki de ihtiyacım olan şey sadece daha fazla açıklamadır). Bu, tüm çocuk unsurları arasında döngü oluşturmayı gerektirip gerektirmediğine dair ... Bu bölüm benim için hala mantıklı değil… –

+1

Verimlilik konusunda endişeleniyorsunuz sadece bir Depolanmış Prosedür veya ham SQL yazınız. EF bunun için iyi bir destek. – Stilgar

cevap

2

Toplu Silme ve herhangi bir Toplu güncelleştirme bildirimi, varsayılan Entity Framework davranışından bir sınırlamadır. Etraftaki bir çalışma, bu toplu komutları, varlıkları silmek için bellekten belleğe almak zorunda kalmadan izin veren bu uzantı kitaplığını kullanmaktır.

https://github.com/loresoft/EntityFramework.Extended. Ayrıca, çeşitli işlevlerin nasıl kullanılacağı hakkında o sitede iyi belgelere sahiptir.

+0

Teşekkür ederim! - Sadece merak ettim, EF6'da zaten bunu yapan bir şey yok, doğru mu? –

+1

Bildiğim kadarıyla, hızlı bir Google araması hiçbir şey açmadı. Bu muhtemelen değil demektir. Ne bulabildiğimi, bunun EF'in yapmaya çalıştığı şeyin kapsamı dışında kaldığını, bu da Nesne Eşlemesi'nin sıkı bir şekilde yapıldığını söyledi. umarım yardımcı olur. – Madullah

+0

Eğer bir üçüncü parti kütüphanesi olmak istemediğiniz için soruyorsanız, FWIW bu uzantıları kendiniz yazabilirsiniz. Yorumlardaki SO sorusu, toplu bir silme için örnek kod gösteren ikincil bir cevap aldı. – Madullah

3

Basit toplu silme işlemlerinde, genellikle doğrudan SQL deyimini doğrudan yayımlarım. yani:

context.Database 
    .ExecuteSqlCommand("DELETE FROM TheTable Where MyColumn = {0}", parameter); 

Daha gelişmiş destek, hem de kullanım Ef Genişletilmiş eserlerin sonra diğer cevap almak istiyorsanız. Bu, ek bağımlılıklara ihtiyaç duymayan basit sorgular yapmanın basit bir yoludur.

Bununla birlikte, bunu yaparken DbContext'in dahili önbelleğinin veritabanınızla eşitlenemeyeceğini unutmayın. Yani böyle bir komut gerçekleştirdikten sonra, yeni bir içerik geliştirene kadar Nesne ile ilgili daha fazla sorgu yapmamak en iyisidir.

+0

Çok teşekkürler, Erik, Bunu yapmanın bir yolu olduğunu düşünüyordum, sadece EF için çok yeni olmanın, o kadar makul bir şekilde gerekli görülen bir şeyde programlanmış olduğunu ummuştum ... Ve özellikle de ipucu için teşekkürler Aynı bağlamı kullanarak ... Eminim çok kullanışlı olacak! –

+0

Bir sorum daha var - Bilginize baktığımızda, yazdıkça veya saklı bir prosedürün daha iyi olmasını ister misiniz? –

+1

@JohnBustos - Şirketinizin bunları kullanmasını istemediği sürece, saklı bir prosedürde bu kadar basit bir şey için çok az değer vardır. –