Bir ORM for.NET'i değerlendirmek için kriterler nelerdir? [kapalı]


30

ORM'leri değerlendirmeye bakıyorum.

Ben kullandım ses altı , Linq SQL ve Varlık Framework . Gençlerden yaşlılara kadar çeşitli geliştiricilerden oluşan bir ekibim var.

ORM for.NET'i değerlendirmenin kriterleri nelerdir?


8
En iyisi yok. Artıları ve eksileri olan birçok seçenek var. Her biri masaya farklı bir şeyler getiriyor.
Tony

Terminoloji üzerine bir çekişme: SubSonic'in kesinlikle bir ORM olmadığını söyleyebilirim . Bir .. ilişkisel-nesne tanıtıcısı daha. Yalnızca doğrudan veritabanı tablosu şemanızı yansıtan sınıflar oluşturabilir. Çoğunlukla iyi çalışır, ancak bu tasarım noktası EF & NHib'den çok farklı bir oyun alanında olduğu için oldukça önemlidir.
quentin-starin

1
@ qstarin: bu SubSonic'i LINQ-SQL kadar ORM yapar.
John Saunders

çok iyi bir nokta, John ve Qstarin. Bu, nesneden ilişkiye açıklayıcı olarak kategorize edeceğiniz şeydir. SubSonic 3.0, ORM kavramlarıyla aynı çizgide olan özellikler sunar. Wiki diyor. "Nesne yönelimli programlama dillerinde uyumsuz tip sistemler arasında veri dönüştürme. Bu aslında programlama dilinden kullanılabilecek bir" sanal nesne veri tabanı "oluşturur.” ayrıca ormbattle.net'te SubSonic, ORM olarak kabul edilir. Geri bildiriminiz için teşekkür ederiz
Nickz

2
Linq-to-SQL'i bir ORM'den çok şanlı bir sql üreteci gibi görüyorum ...
fretje

Yanıtlar:


43

Yüklenmiş bir soru.
Farklı felsefelerle konuya yaklaşan pek çok iyi ORM vardır.
Hiçbiri mükemmel değildir ve hepsi altın yollarından saptığınız anda (ve hatta bazen buna bağlı kaldığınızda) karmaşık olma eğilimindedir.

Bir ORM seçerken kendinize sormanız gerekenler:

  1. Senin için ne yapması gerekiyor?
    Uygulamanız için zaten bir takım gereksinimleriniz varsa, varsayımsal bir 'en iyi' yerine, bunlarla daha iyi eşleşen ORM'yi seçmelisiniz.

  2. Verileriniz paylaşılıyor mu yoksa sadece yerel mi?
    ORM'deki saç dökülmesinin büyük bir kısmı eşzamanlılığı nasıl ele aldıklarından ve birden fazla kullanıcı aynı verinin sürümlerini tutarken veritabanındaki verilerdeki değişikliklerden kaynaklanır.
    Veri mağazanız tek bir kullanıcı için kullanılıyorsa, çoğu ORM iyi bir iş çıkarır. Ancak, çok kullanıcılı bir senaryoda kendinize bazı zor sorular sorun: kilitleme nasıl yapılır? Bir nesneyi sildiğimde ne olur? İlgili diğer nesneleri nasıl etkiler? ORM arka uçtaki metale yakın mı çalışıyor veya çok fazla veriyi önlüyor mu (hastalık riskini arttırma pahasına performans artışı).

  3. ORM, uygulamanızın türüne uygun mu? Bir hizmette kullanılıyorsa veya bir web uygulamasının içinde oturuyorsanız, belirli bir ORM ile çalışmak zor olabilir (yüksek performans, kod zor). Aksine, masaüstü uygulamaları için harika olabilir.

  4. Veritabanına özgü geliştirmelerden vazgeçmek zorunda mısınız?
    ORM'ler, çok sayıda farklı veritabanı arka uçuyla çalışmalarını sağlamak için en düşük ortak payda olan SQL setini kullanma eğilimindedir.
    Tüm ORM'ler mevcut özelliklerden ödün verecekler (özellikle tek bir arka ucu hedeflemedikleri sürece) ancak bazıları seçtiğiniz arka uçtaki mevcut özelliklerden yararlanmak için ek davranışlar uygulamanıza izin verecek.
    Db'ye özgü tipik bir geliştirme, örneğin, Tam Metin arama özellikleridir; ORM'nizin, ihtiyaç duyduğunuzda bu özelliklere erişmenin bir yolunu sağladığından emin olun.

  5. ORM veri modelindeki değişiklikleri nasıl yönetir?
    Bazıları DB'yi belirli bir önlemle otomatik olarak güncelleyebilir, diğerleri hiçbir şey yapmaz ve kirli işi kendiniz yapmanız gerekir; diğeri, veritabanı güncellemelerini kontrol etmenizi sağlayan değişikliklerle ilgili bir çerçeve sağlar.

  6. Uygulamanızı ORM'nin nesnelerine bağlamayı düşünüyor musunuz veya POCO'ları ve kullanıcıyı kalıcılık için bir adaptör kullanmayı tercih ediyor musunuz?
    İlki genellikle işlenmesi basittir ancak ORM'ye özgü veri nesnelerinize her yerde bağımlılık yaratır, ikincisi biraz daha fazla kod pahasına, daha esnek.

  7. Nesnelerinizi uzaktan aktarmanız gerekecek mi?
    Uzak bir sunucudan nesneler almaya gelince, tüm ORM'ler eşit değildir, yapılması mümkün olan veya imkansız olan şeylere yakından bakın. Bazıları verimli, bazıları değil.

  8. Yardım için başvurabileceğin biri var mı?
    İyi ticari destek var mı? Proje etrafındaki topluluk ne kadar büyük ve aktif?
    Mevcut kullanıcıların ürünle ilgili sorunları nelerdir?
    Hızlı çözümler alıyorlar mı?

Baktığım birkaç ORM:

  • XPO
    geliştirici Express Gönderen: küçük ve basit, kod merkezli. EXpressApp uygulama çerçevesi için kullanırlar .
  • NHibernate
    Ücretsizdir, ancak öğrenme eğrisi oldukça dik. Çok sayıda güzellik var ama bazen parçalanmış tüm belgelerde gerçekte neyin alakalı olduğunu bulmak zor.
  • LLBLGen Pro
    çok olgun bir proje, en basit değil, çok düşünülmüş.
  • Varlık Çerçevesi
    GEtting orada. Son sürümler oldukça iyi ve MS daha fazla olgunlaşmış ORM'lere kıyasla hala biraz daha genç olmasına rağmen dinliyor.
  • DataObject.Net
    Gelecek vaat ediyor gibi görünüyor ama aynı zamanda IMHO için önemli bir projeyi riske atmak için biraz yeni. Oldukça aktif olsa da.

Tabii ki çok daha var.

Tartışmalı site ORM Battle'a bazı performans ölçütlerini listeleyen bir göz atabilirsiniz , ancak ham hızın projeniz için mutlaka en önemli faktör olmadığını ve web sitesinin üreticilerinin DataObject.Net olduğunu bilmeniz gerekir.


3
Bunu bilerek, ne seçtin?
Steven Evers

teşekkürler Renaud Bompuis, listelenen ORM'lerin bazılarını duymadım. Sağladığınız bilgiler düşünce için harika bir yiyecek, teşekkürler.
Nickz

1
@SnOrfus: hala XPO kullanıyor ancak LLBLGen'e geçeceğim, sağlam, olgun ve kontrol sizde kalıyor (böylece ihtiyaç duyuyorsanız / isterseniz ellerini hala kirletebilirsiniz) ve endişelerin daha yeterli şekilde ayrılmasını sağlar ve nesne yeniden kullanımı (Adaptör ile).
Renaud Bompuis

3
Entity Framework'ün şu anda 4.1 sürümünde olduğunu ve kesinlikle şimdi bakmaya değer olduğunu unutmayın.
Sean Kearon

Sunucudaki Stored Procs'u ve istemcideki LINQ'i seviyorum. Aşağı oy vermeye çalış! Öğrenme eğrisi yok, sürpriz yok, sürüm yok, sürpriz yok!
NoChance

14

NHibernate kullanıyorum ve oldukça iyi buldum.

Benim durumumda bir MS SQL veritabanına bağlı, ancak diğer veritabanlarına bağlanabilirsiniz.

Kalkması ve çalışması uzun sürmüyor - sadece nesnenizi modele eşleyin - xml dosyası kullanıyorum ancak kodunuzu akıcı bir şekilde yapabilirsiniz. Orada büyük bir topluluk var ve şahsen bulduk Ayende en çok yardımcı olmaya çalışması - Bir sql profil oluşturma aracıdır NHProf kullanın.

Çoğu zaman kutu dışı işlevlerini kullanırım - düz nesne eşlemesi, ancak elde edilmesi oldukça kolay olan Hazırda Bekletme Dili'ni de kullandım.


Dikkatli olun, NHibernate daha karmaşık modeller için zor olabilir. Her şey çok iyi belgelenmiş ve çok iyi anlam ifade ediyor, ancak farkında değilseniz sorun yaşayabilirsiniz. Başka bir deyişle, öğrenme eğrisi yüksektir, ancak mükemmeldir.
Matt Olenik

teşekkürler Sam, nhibernate kullanmadım, ancak SubSonic, Linq-SQL ve Entity Framework ile karşılaştırıldığında kapsamlı bir yapılandırma gerektiriyor gibi görünüyor. Bu benim geliştirme ekibim için ideal olmaz.
Nickz

İlgileniyorsanız, Ayende, YOW Australia konferansında bir NHibernate atölyesi veriyor - yowconference.com.au/melbourne/events_tracks/… - Kasım / Aralık'ta. Çalıştığım adamlardan biri bir süre kullandı, bu yüzden onu öğrenmenin yararı oldu.
Sam J

3
@ Yapılandırmanın çoğu otomatikleştirilebilir. Ayrıca akıcı eklentiyi de kontrol ederim.
stonemetal

@Nick, @stonemetal karar verdi, Fluent NHibernate işleri çok kolaylaştırıyor. SubSonic kadar hızlı değil, ama yine de göz atmaya değer.
Matt Olenik

6

Ne yazık ki, son üç mesleğimde evde yetiştirilen üç ORM vardı. Her durumda, çoğunlukla çeşitli nedenlerden dolayı emilirler.

Son zamanlarda Entity Framework 4 ve POCO desteğini değerlendiriyordum (güzel bir adım burada ) ve yüzümden ne kadar güzel kaldığı ve veri toplama yerine tekrar programlanıyormuş gibi hissetmeme gerçekten çok etkilendim.


Seni duydum, önceki işlerde ben, evde yetiştirilen ORM'lerin benzer bir pozisyonundaydım. Geri bildirim için teşekkürler.
Nickz

3
Evde yetiştirilen ORM'ler daima emilir. En iyileri her zaman en sarp kamu ORM'lerinden daha kötüdür.
Jaco Pretorius

@JacoPretorius Buna karşı örnekler var ... ama "genel bir kural olarak" ...
pst


3

Linq'i Sql'ye çok seviyorum. Çok basit ve iyi bir tasarımcıya sahip. Ancak, ömrünün Varlık çerçevesi lehine bitmesini umuyorum. Jeneratörleri değiştirebilme özelliğinden yararlanarak özelleştirilmiş nesneler elde edebilmek istiyorum.

Bunların başkalarına nazaran en büyük yararı (benim görüşüme göre) VS ile birlikte olmalarıdır. Bu aynı zamanda MS'in insafına olduğunuzda negatif (bkz. Linq to Sql).


3

[YASAL UYARI: DevExpress için çalışıyorum]

DevExpress uygulama çerçeveleri tarafından oluşturulan tipik uygulamaların ekran görüntülerini burada görebilirsiniz . Bu sayfa ayrıca ürünlerimiz hakkında kısa bir inceleme içermektedir. Hakkında daha detaylı bilgi almak için neden seni web sitesinde ilgili ürün sayfalarına bakmanızı tavsiye.

DevExpress XAF ve Xpo gelince, burada bizim uygulama çerçeveleri seçmek için neden iyi bir açıklama. Ayrıca, önemli ve bahsetmeye değer olan destek ve dokümantasyon da sağlıyoruz. Herhangi bir sorunuz durumunda bizimle temas kurmaktan çekinmeyin.


Hala XPO kullanıyorum ve gelecek güncellemelerden memnunum.
Renaud Bompuis

2

Küçük projelerde Linq to Sql ile NHibernate + Fluent NHibernate kullanıyoruz. Bunun nedeni:

1) (Başlıca sebep değil) NHibernate, geliştiriciler arasında daha yüksek bir "saygı" faktörüne sahip görünüyor (bu doğru mu?),

2) linq-SQL ile karşılaştırıldığında, nHibernate, Db nesneleri ile 1'e 1 arasında eşlenmeyen varlıklar arasında ORM eşlemesine izin verir,

3) nHibernate'i Entity Framework 4.0 ile kapsamlı bir şekilde karşılaştırmadık, ancak iyi bir karşılaştırma: http://ayende.com/blog/archive/2010/01/05/nhibernate-vs.-entity-framework-4.0.aspx

nHibernate biraz dik bir öğrenme eğrisine sahiptir ve XML haritaları oldukça ayrıntılı olabilir, ancak Fluent Nhibernate site dokümantasyonu ile başlayın ve geriye doğru ilerleyin.


1

"En iyi" bir ORM çerçevesi yoktur, çünkü hepsinin farklı güçlü ve zayıf yönleri vardır ve eğer geliştiriciler bir alanı daha iyi hale getirmeye odaklanmayı tercih ederse, karşılaştırmalı olan diğer alanların var olma eğiliminde olma eğilimindedir (önce kod ve modelin ilk önce veritabanıyla karşılaştırılması).

Öte yandan, bazıları kişisel durumunuza ve felsefenize diğerlerinden daha iyi eşleşecek çok iyi olanlar vardır .


Düzenleme: Değeri ne olursa olsun, şu anda Linq to SQL kullanıyorum - bunun nedeni kısmen de olsa çünkü en az çaba için çok doğru bir şey yapıyor ve muhtemelen Entity Framework’e tekrar “çünkü orada” çünkü EF4 hakkında doğru olan, yanlış olan bazı şeylerin yanı sıra. Özellikle sonuncusu ile ilgili kaygı performans olmak zorunda kalacaktı ancak çoğu durumda bu büyük bir sorun değil ve Dinamik Veri ve OData'yı modellerden çalıştırma kabiliyeti (L2S ve EF) benim için önemli faydalar sağladı. " ucuz "kazanır.


Geri bildiriminiz için teşekkür ederiz Murph. "En iyi" ORM konusunda hemfikirim. Ancak daha fazla standardizasyon kurmayı düşünüyorum. ORM'lerden birini kullanmak, ekibimdeki yeni geliştiriciye ve mevcut geliştiricilere yardımcı olacak. Şu anda her şeyin kullanılması, sesaltı, ADO.net, linq-sql vb. Projeler ve bakım arasında geçiş yapmak daha zor hale geliyor.
Nickz

Oh, kullanım durumunuz için en uygun ORM arayışınızla ilgili bir sorunum yok ve bu soruya ilişkin soru sorma isteğine tamamen katılıyorum. Yığın değişim sorularında "BEST" kelimesinin kullanılmasına karşı boş bir kampanya yürütüyorum (-:
Murph

1

DevExpress XPO'ya bir göz atmanızı tavsiye ederim . Bu, DevExpress XAF ile birlikte , öğrenme eğrisi aşıldığında bir geliştiricinin hayatını kolaylaştıracak.


XAF, ORM olan XPO'ya dayanmaktadır. XAF kendisi bu konuda 's inşa ve eklenti "otomatik" mantığı ve UI vb var
Sascha

Lütfen DevExpress XAF'in geliştiricinin ömrünü kolaylaştıracağını düşündüğünüzü açıklayın.

@Schacha, ipucunuz için teşekkürler. Gönderimi düzelttim.
Yogi Yang 007

@Mark, XOF, XPO ile birlikte bir ORM ve UI üreteci olarak çalışır, böylece geliştiricinin .NET'te en az kodlamayla tam işlevsel uygulamalar oluşturması kolaylaşır.
Yogi Yang 007

Benim tarafımdan XAF'a bir yorum: Orta ölçekli işletme mantık ortamları için harika bir sistem çünkü faktörler için geliştirme süresini hızlandırıyor. Dezavantajı, verilen sınırlarda, tekrar genişletmek için çok zaman alıcı olmasıdır. Örneğin, hiyerarşik kullanıcılar (mantık gibi ekiplerle birlikte) ve 'bir kullanıcı yalnızca kendisinin ve / veya astlarının öğelerini görebilir' kutusundan desteklenmiyor. Bu yüzden, XAF'ın bir artıları ve eksileri var, IMHO - bir projeye uygun olup olmadığının gerçekten değerlendirilmesi gerekiyor. Ama uygunsa kesinlikle iyi bir temeldir.
Sascha

1

Entity Framework konusunda iyi şanslar elde ettik. Durumumuz biraz sıradışı olsa da - raporlama ekibi için veri toplama yapıyoruz, bu yüzden aslında veritabanını tasarlıyorlar. Veritabanını alıyoruz ve veri erişim sınıflarını oluşturmak için sadece EF kullanıyoruz. Bizim için harika çalışıyor, ancak toplu veri yükleri yapıyoruz, bu nedenle daha işlemsel bir ortamda ne kadar iyi sonuç aldığına dair garanti veremiyorum.


2
Evet, EF 4 hayranıyım önceki sürümden çok daha iyi.
Nickz

1

NHibernate (+ FluentNHibernate) benim için varsayılan seçenek olacaktır. Çok esnek, genişletilebilir ve sağlamdır. Çok fazla sayıda kullanıcısı var ve çok aktif bir şekilde sürdürülüyor. Dezavantajı dik öğrenme eğrisi.

MindScape'in LightSpeed basit ve kullanıcı dostu, ancak oldukça esnek ve yetenekli. L2S / EF gibi bir tasarım yüzeyine ve UnitOfWork uygulamasına sahiptir.


MindScape'in LightSpeed'i gerçekten ilginç görünüyor.
Nickz

1

Eh, "en iyi" bir seçenek yok ama normal Linq to SQL'in ihtiyaçlarınızı karşıladığını söyleyebilirim. Kendi başına "gerçek" bir ORM değildir, ancak çok hafiftir ve eğer mantıklı değilse, kodunu bilmeden kod yazma esnekliğini verir. Demek istediğim, normal bir şekilde kod yazmaya devam edebilmenizdir;dbml dosya (lar) ın . Depo veya Ağ Geçidi düzenlerini kullanarak üzerine yine de soyutlamalar yazabilirsiniz ve L2S, Nesne İlişkili Uyumsuzluğun üstesinden gelmek üzere olan bir ORM'nin ana rolünü yerine getirir.

Varlık Çerçevesi biraz ağırdır ve ben sadece onunla biraz uğraşırken, temel Linq'tan Sql'ye göre daha "yüzünüzde", ancak EF, Linq'den çok daha fazla gerçek ORM'dir. Bir ORM'de aradığınız kriterlerin tümüne bakardım. Ham ham SQL yazmak zorunda kalmamak veya daha da kötüsü, yüzlerce Saklı İşlem yapmaktan kaçınmak mı? Ham Linq - Sql ürününün sağlayamadığı bazı ekstra özelliklere mi ihtiyacınız var? Bu soruları cevaplamanız gerekiyor, ancak kısa gereksiniminize göre ("hafif ve kullanımı kolay"), Linq'in Subsonic gibi bir şeyden biraz daha kolay olduğunu ve Visual Studio'da yerleşik olduğunu düşünüyorum.


0

ECO :) Durum makineleri ve çalıştırılabilir OCL (yani EAL) desteği dahil ederken, bir ORM'den çok daha fazlası. Küçük projeler için oldukça temiz olması gerektiğini düşündüğüm 12 alan sınıfı sınırlaması olan ücretsiz bir sürümü var.


4
Nedenini açıklarsan yardımcı olur.
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.