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?
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?
Yanıtlar:
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:
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.
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ışı).
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.
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.
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.
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.
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.
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:
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.
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.
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.
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).
[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.
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.
"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.
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.
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.
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.
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.