Entity Framework VS LINQ to SQL VS ADO.NET saklı yordamlar ile? [kapalı]


430

Her birini şu şekilde nasıl değerlendirirsiniz:

  1. Verim
  2. Geliştirme hızı
  3. Düzgün, sezgisel, bakımı kolay kod
  4. Esneklik
  5. tüm

Ben SQL gibi ve bu yüzden her zaman ADO.NET ve saklı yordamlar çok zor bir hayranıydım ama son zamanlarda Linq to SQL ile bir oyun vardı ve benim DataAccess katmanı yazma ne kadar hızlı tarafından uçurulmuştu ve harcama karar verdik bir süre Linq to SQL ya da EF ... ya da hiçbiri gerçekten anlamak?

Sadece bu teknolojilerin hiçbirinde araştırma zamanımı işe yaramaz hale getirecek büyük bir kusur olmadığını kontrol etmek istiyorum. Örneğin, performans korkunç, basit uygulamalar için harika, ancak sizi şu ana kadar alabilir.

Güncelleme: ORM VS SP'ler yerine EF VS L2S VS SP'lere konsantre olabilir misiniz? Esas olarak EF VS L2S ile ilgileniyorum. Ancak, düz SQl hakkında çok şey bildiğim bir şey olduğundan, onları depolanan proc'larla karşılaştırmaya meraklıyım.


94
yapıcı değil ve henüz çok upvotes? ...;)
BritishDeveloper

34
Birisinin bunu neden yapıcı değil olarak işaretlediğini anlamıyorum. Bana çok iyi geliyor. Benden +1.
Thanushka

10
Bu benim görüşüme göre mükemmel bir soru. Şahsen, Entity Framework ve tüm benzer ORM'leri düz / basit ADO.Net koduna göre daha yavaş fark ettim. Bu testi 2 yıl önce ve sonra tekrar bir hafta önce yaptım. LINQ to SQL EF ile nasıl karşılaştırılır emin değilim. Ancak ADO.Net her zaman en iyi performans olacaktır. Geliştirme zamanından tasarruf etmek istiyorsanız, Entity Framework iyi bir araçtır, ancak performans birincil endişeniz olduğunda kesinlikle değildir.
Sunil

2
@Timeless: Veritabanı mekanizmalarına güvenmeme eğilimi var. Her veritabanı motorunun kendi saklı yordam dili vardır, bu nedenle ek öğrenme vardır. Geliştiricilerin% 99,9'u oldukça iyi kod üreten ve otomatik olarak SQL oluşturan ORM'lere güvenebilir. Basit CRUD durumunda performans farkı marjinaldir. Saklı prosedürlerin geliştirilmesi ve bakımı daha zordur. Birkaç yıl önce, ORM'lerin olmadığı ve sihirli ve otomatik olarak veritabanının hiçbir şeyi üretilmediğinde. Uygulamada SQL ifadeleri yazmanın alternatifi olduğundan, SP'leri yazmak çok zaman alıcı değildir.
LukLed

4
@Sunil doğru, ancak yeterince garip değil. Sorun, herkesin birincil kaygısının uygulama performansı olduğunu düşünmesidir. En iyi performans gerektiren uygulamalar hakkında konuştuğumda, yüksek C milyon MMO'ları veya yüksek milyonlarca müşteriye yönelik yüksek hacimli veritabanı işlemlerini düşünüyorum. Gerçekten sürdürülebilirlik , okunabilirlik , kalıcılık bilgisizliği ve etki alanı mantığı ayrımı gibi nesneye yönelik ilkelere odaklanmalısınız . Özellikle performans artışı en iyi düzeyde en düşük olduğunda veya çoğu durumda mevcut olmadığında.
Suamere

Yanıtlar:


430

Öncelikle, yeni bir projeye başlıyorsanız, Entity Framework ("EF") ile devam edin - artık çok daha iyi SQL üretir (Linq to SQL gibi) ve Linq to SQL'den daha kolay ve daha güçlüdür (" L2S "). .NET 4.0'ın piyasaya sunulmasından itibaren, Linq to SQL'i eski bir teknoloji olarak görüyorum. MS, L2S gelişimini daha fazla sürdürmeme konusunda çok açıktı.

1) Performans

Cevaplamak zor. Çoğu tek varlıklı işlem ( CRUD ) için, üç teknolojinin tamamında neredeyse eşdeğer bir performans bulacaksınız. EF ve Linq to SQL'in tam olarak kullanılabilmesi için nasıl çalıştığını bilmek zorundasınız. Yoklama sorguları gibi yüksek hacimli işlemler için, EF / L2S'nin varlık sorgunuzu çerçevenin sürekli olarak SQL'i yeniden oluşturmak zorunda kalmayacağı veya ölçeklenebilirlik sorunlarıyla karşılaşabileceği şekilde "derlemesini" isteyebilirsiniz. (düzenlemelere bakın)

Çok miktarda veri güncellediğiniz toplu güncellemeler için, ham SQL veya saklı bir prosedür her zaman bir ORM çözümünden daha iyi performans gösterecektir, çünkü güncellemeleri gerçekleştirmek için kablo üzerinden veriyi ORM'ye marshallemek zorunda kalmazsınız.

2) Geliştirme Hızı

Çoğu senaryoda EF, geliştirme hızı söz konusu olduğunda çıplak SQL / depolanmış proc'ları patlatacaktır. EF tasarımcısı, modelinizi değiştikçe veritabanınızdan güncelleyebilir (istek üzerine), böylece nesne kodunuz ve veritabanı kodunuz arasında senkronizasyon sorunlarıyla karşılaşmazsınız. Bir ORM kullanmayı düşünmediğim tek zaman, güncelleme yapmadığınız bir raporlama / pano tipi uygulama yaptığınızda veya sadece bir veritabanında ham veri bakım işlemleri yapmak için bir uygulama oluştururken.

3) Düzenli / Sürdürülebilir kod

Eller aşağı, EF SQL / sprocs'u yener. İlişkileriniz modellenmiş olduğundan, kodunuzdaki birleştirmeler nispeten nadirdir. Varlıkların ilişkileri, çoğu sorgu için okuyucu için neredeyse açıktır. Verilerinize gerçekte ne olduğunu anlamak için katmandan katmana hata ayıklamaya veya birden çok SQL / orta katmana gitmek zorunda kalmaktan daha kötü bir şey yoktur. EF, veri modelinizi çok güçlü bir şekilde kodunuza getirir.

4) Esneklik

Kayıtlı işlemler ve ham SQL daha "esnektir". Tek özel durum için daha hızlı sorgular oluşturmak için sprocs ve SQL'den yararlanabilirsiniz ve yerel DB işlevlerinden ve ORM'den daha kolay yararlanabilirsiniz.

5) Genel

Saklı yordamları kullanarak bir ORM seçmenin yanlış ikilemine kapılmayın. Her ikisini de aynı uygulamada kullanabilirsiniz ve muhtemelen kullanmalısınız. Büyük toplu işlemler saklı yordamlarda veya SQL'de (aslında EF tarafından çağrılabilir) yapılmalıdır ve EF, CRUD işlemleriniz ve orta katman gereksinimlerinizin çoğunda kullanılmalıdır. Belki de raporlarınızı yazmak için SQL kullanmayı tercih edersiniz. Sanırım hikayenin ahlaki her zamanki gibi. İş için doğru aracı kullanın. Ama sıska, EF bugünlerde çok iyi (.NET 4.0'dan itibaren). Bunu okumak ve anlamak için gerçek zamanlı biraz zaman harcayın ve kolayca şaşırtıcı, yüksek performanslı uygulamalar oluşturabilirsiniz.

DÜZENLEME : EF 5, otomatik derlenmiş LINQ Sorguları ile bu bölümü biraz basitleştirir , ancak gerçek yüksek hacimli şeyler için, gerçek dünyada sizin için en uygun olanı kesinlikle test etmeniz ve analiz etmeniz gerekir.


35
Kesinlikle mükemmel bir cevap. Şimdi gerçekten hızlı bir şekilde bir uygulama geliştirmek için EF kullanıyorum. Performans sorun haline gelirse, saklanan proc'lar kötü performans gösteren EF sorgularını yeniden düzenlemeye getirilir. Teşekkürler!
BritishDeveloper

17
@BritishDeveloper: Ayrıca, görünümleri kullanmanın gücünü de unutmayın. L2S projelerimizde birkaç görüş tanımlamak ve çerçevenin zayıf sorgular yazdığı yerlerde onları kullanmakta büyük başarı elde ettik. Bu şekilde, kendi SQL'imizi yazmanın tüm avantajlarıyla çerçeveyi kullanmanın tüm avantajlarını elde ederiz.
Dave Markle

5
Ayrıca Views;) Daha fazla EF olmayan çapraz db sınırlaması için bir çözüm olarak kullanıyorum. Optimizasyon için kullanmak için iyi bir fikir olsa. Teşekkür
BritishDeveloper

5
Kesinlikle harika bir yanıt. Sadece L2S vs EF4 ile yaşadığım deneyime bir gözlem eklemek istedim. Birkaç farklı Ethernet RDMBS kullanıyor olabileceğimizi fark ettikten sonra L2S -> EF4'ten değiştirildi ... ama yine de MSSQL çalıştırırken performans düşüşü esas olarak uygulamamın GUI alanında gösterdi. L2S'deki sonuç kümesine veri eklemek EF4'ten çok daha hızlıydı. Aynı DB'de aynı sorgu. Burada not edilmesi gereken bir şey, 90k + kayıtları döndürüyorum, bu yüzden fark oldukça açıktı. Belki daha küçük setlerde sorun değil mi? Emin değilim nasıl yüksek vol siteleri ile ölçek ...
bbqchickenrobot

5
İyi yanıt. Sadece 4 hafta LINQ-to-Entities ile çalışarak, her şeyi onun içinde ayakkabı çekmeye çalışarak geçirdim, sonunda toplu kopyalama, toplu silme, yinelenenleri bir veritabanından ultra hızlı kaldırma gibi şeyler için yerel SQL'e ihtiyacınız olduğunu fark etmeden önce iş için doğru araç, yerel SQL LINQ to Entities çerçevesiyle karışmak için hiçbir utanç yoktur.
Contango

93

Saklı yordamlar:

(+)

  • Mükemmel esneklik
  • SQL üzerinde tam kontrol
  • Mevcut en yüksek performans

(-)

  • SQL bilgisi gerektirir
  • Saklı yordamlar kaynak denetimi dışında
  • Aynı tablo ve alan adlarını belirlerken önemli miktarda "kendinizi tekrar etme". Bir DB varlığını yeniden adlandırdıktan ve bir yerde bazı referansları kaçırdıktan sonra uygulamayı kırma olasılığı yüksektir.
  • Yavaş gelişme

ORM:

(+)

  • Hızlı gelişim
  • Veri erişim kodu artık kaynak kontrolü altında
  • DB'deki değişikliklerden izolesınız. Böyle bir durumda, modelinizi / eşlemelerinizi tek bir yerde güncellemeniz gerekir.

(-)

  • Performans daha kötü olabilir
  • ORM'nin ürettiği SQL üzerinde hiç veya çok az kontrol (verimsiz veya daha kötü bir hata olabilir). Müdahale edilmesi ve özel saklı prosedürlerle değiştirilmesi gerekebilir. Bu, kodunuzu dağınık hale getirecektir (bazı LINQ kod, bazı SQL kod ve / veya DB kaynak kontrolü dışında).
  • Herhangi bir soyutlama, kaputun altında nasıl çalıştığını bilmeyen "yüksek seviyeli" geliştiriciler üretebileceğinden

Genel ödünleşim, büyük bir esnekliğe sahip olmak ve çok fazla zaman kaybetmek ve yapabileceğiniz şeyle kısıtlanmak, ancak çok hızlı bir şekilde yapılması arasındadır.

Bu sorunun genel bir cevabı yok. Bu kutsal savaşlar meselesi. Ayrıca elinizdeki bir projeye ve ihtiyaçlarınıza bağlıdır. Sizin için en uygun olanı alın.


47
Kaynak kontrolü ile ilgili hususların önemli olduğunu düşünmüyorum. Veritabanı şeması, saklı yordamlar, UDF'ler vb. Kaynak denetimi altında olabilir.
Lee Gunn

15
+1 içinAs any abstraction can produce "high-level" developers having no idea how it works under the hood
nawfal

3
Kabul edildi, kaynak kontrol argümanı yanlış. Veritabanı oluşturma komut dosyalarımızı her zaman svn'de saklarız. Bir veritabanı uygulaması geliştirirken veritabanını nasıl kaynak kontrolü dışında tutabilirsiniz?
Wout

3
EF yüksek kullanılabilirlik ve yüksek performans için gerçekten uygun değil, ben bir DBA adamı değilim ama EF'in ne sunduğunu göremiyorum, bu da kodlamayı kolaylaştırıyor.
Jamie

4
Bu nedenle, "hızlı geliştirme" için esneklik, tam kontrol ve performanstan vazgeçiyoruz ve DB değişirse kod değişikliklerinden kaçınıyoruz. Bana saf tembellik gibi geliyor.
user2966445

18

sorunuz temelde O / RM ve SQL yazma

ORM veya düz SQL mi kullanıyorsunuz?

Oradaki diğer O / RM çözümlerine bir göz atın, L2S tek değil (NHibernate, ActiveRecord)

http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software

belirli soruları yanıtlamak için:

  1. O / RM çözümünün kalitesine bağlı olarak, L2S SQL üretmede oldukça iyidir
  2. İşlemi gerçekleştirdikten sonra O / RM kullanmak normalde çok daha hızlıdır
  3. Kod da genellikle daha temiz ve daha sürdürülebilir
  4. Düz SQL elbette size daha fazla esneklik sağlayacaktır, ancak çoğu O / RM en karmaşık sorgular dışında tümünü yapabilir
  5. Genel olarak bir O / RM ile gitmenizi öneririm, esneklik kaybı ihmal edilebilir

@David Teşekkürler, ancak SQL vs ORM değildir. ORM'ye taşınmak istiyorum ve öğrenmeye zaman ayıracağımı merak ediyorum: EF veya L2S (Kayıtlı Procs ile karşılaştırıldığında çöp olmadıkça)
BritishDeveloper

1
Kesinlikle depolanan procs ile karşılaştırıldığında çöp olmadığını söyleyebilirim ve bir yan yararı, veritabanına yayılmış kod yok olmasıdır. Şahsen L2S'yi seviyorum, ancak bu noktada EF ile pek bir şey yapmadım ve L2EF'in yerini alacağı anlaşılıyor, bu yüzden EF'e giderdim. Ayrıca, Linq'e gittiğinizde geri dönmezsiniz.
BlackICE

13

LINQ-to-SQL, kullanımı çok basit ve büyük ölçüde arka uca çok iyi sorgular üreten dikkate değer bir teknoloji parçasıdır. LINQ-to-EF, yerini almak için planlandı, ancak tarihsel olarak kullanımı son derece tıknazdı ve çok daha düşük SQL üretti. Mevcut durumu bilmiyorum, ancak Microsoft L2S'nin tüm iyiliğini L2EF'e geçireceğine söz verdi, bu yüzden belki de şimdi daha iyi.

Şahsen, RM araçları (benim hiciv bakınız tutkulu bir antipati var burada L2S bana bütün verir beri, L2EF lehine hiç bir neden görmüyorum detaylar için) ve bu yüzden hiç bir veri erişim katmanından ihtiyaca bekliyoruz. Aslında, el yapımı eşlemeler ve kalıtım modellemesi gibi L2S özelliklerinin tamamen gereksiz karmaşıklık getirdiğini düşünüyorum. Ama bu sadece benim. ;-)


1
L2S oldukça iyi, ancak Microsoft'un temelde onu genişletmek için çok fazla yatırım yapmayacaklarını belirttiği dezavantajı var. Bunun sonuçlarını yalnızca birkaç hata düzeltmesi olan ve SQL Server 2008 veri türleri için bazı desteklerin eklendiği en son sürümde görebilirsiniz.
FinnNk

Kabul edildi, @FinnNk. L2S kullanımının pariah statüsü nedeniyle biraz riskli olması talihsiz bir gerçektir. Ama gerçekten L2EF lehine tamamen fob yaptılarsa, bir göç yolu olacağından şüpheleniyorum, çünkü aşağıdakiler hala hoşuna gidiyor.
Marcelo Cantos

3
Linq to EF olgunlaştı ve şimdi L2S kadar iyi SQL üretiyor (.NET 4.0'dan itibaren). L2EF günümüzde L2S'den çok daha hoş, çünkü en azından L2S'nin asla otomatik olarak yapamayacağı DB değiştikçe modelinizi güncelleyebilir. Ayrıca, basit bir M: M ilişkisini, ara bir varlığa ihtiyaç duymadan EF ile ilişkiler olarak eşleştirebilmenizi seviyorum. Bu kodu çok daha temiz hale getirir.
Dave Markle

2
@Dave güncellemesi için teşekkürler. Ancak M: M yorumuna katılmıyorum. Çalıştığım şemalar neredeyse her zaman birleştirme tablolarında ekstra özellikler geliştirir. Bu, nesne modelinde çok fazla kod yeniden çalışması gerektiren yapısal bir değişikliğe neden olur. Başından beri açıkça ara ilişkiyle ilgilenmeyi tercih ederim.
Marcelo Cantos

1

Saklı yordamların gücü ve performansı ve Entity Framework gibi araçların sağladığı hızlı geliştirme olup olmadığını düşünmek isteyebileceğiniz yepyeni bir yaklaşım var.

Küçük bir projede test sürüşü için SQL + aldım ve gerçekten özel bir şey. Temel olarak SQL rutinlerinize ne kadar miktarda yorum eklediğinizi ve bu yorumlar bir kod üretecine talimatlar sağlar. Tersine benzer bir varlık çerçevesi.

Girdi parametreleri bir girdi nesnesinin parçası olur, çıktı parametreleri ve sonuç kümeleri bir çıktı nesnesinin parçası olur ve bir hizmet bileşeni yöntem çağrılarını sağlar.

Saklı yordamları kullanmak istiyor, ancak yine de hızlı bir gelişme istiyorsanız, bu şeylere bir göz atmak isteyebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.