Bir “Micro-ORM” in faydalarından bazıları nelerdir?


21

Dapper gibi "Micro ORM'ler" denilen ve (.NET 4.0'a dayandığı kadar az miktarda) araştırıyorum. Bunlar, mevcut sistemimizden bu yana tam gelişmiş bir ORM'den daha kolay uygulanabiliyor. saklı yordamlara oldukça bağımlıdır ve NHibernate veya EF gibi bir ORM ile çalışmak için önemli bir yeniden düzenleme gerektirir. Bunlardan birini tam özellikli bir ORM üzerinden kullanmanın faydası nedir? Sizi hala ham SQL yazmaya zorlayan bir veritabanı bağlantısı etrafındaki ince bir katman gibi görünüyor - belki yanlıştır ama her zaman ilk sırada ORM'lerin nedeninin her zaman SQL yazmak zorunda kalmaması gerektiği söylendi. otomatik olarak oluşturulabilir; özellikle çok masalı birleştirmeler ve saf SQL'de yapılması zor olan ama bir ORM ile önemsiz olan tablolar arasındaki ilişkilerin haritalanması için.

Örneğin, bir Dapper örneğine bakarak:

var connection = new SqlConnection(); // setup here...
var person = connection.Query<Person>("select * from people where PersonId = @personId", new { PersonId = 42 });

Bu, elle yazılmış bir ADO.NET veri katmanını kullanmaktan ne kadar farklıysa, komutu yazmak zorunda olmamanız dışında, parametreleri ayarlayın ve sanırım bir Oluşturucu kullanarak varlığı tekrar eşleştirin. Saklı yordam çağrısı bile SQL dizesi olarak kullanabiliyorsunuz gibi görünüyor.

Bir Micro ORM kullanmanın mantıklı olduğu burada kaçırdığım başka somut faydalar var mı? ADO.NET kullanmanın "eski" yolunda, belki de birkaç kod satırı dışında bir şeyden nasıl tasarruf sağladığını gerçekten göremiyorum - hala hangi SQL'i (hangi tüylü hale getirebilir) çalıştırmanız gerektiğini bulmak için yazmanız gerekir. Tablolar arasındaki ilişkileri haritalandırmanız gerekir (IMHO ORM'lerin en çok yardım ettiği kısım).


+1: Yine de ne olursa olsun bir sorgu diline ihtiyacınız olacak, bu nedenle linq veya sql gibi tanıdık bir şeye bağlı kalabilirsiniz, ancak örneğinizde olduğu gibi adsız türleri döndürmek, ilişkisel bir modeli somut bir etki alanıyla eşleştirmiyor gibi görünüyor modeli. Bu bana garip geliyor.
Steven Evers

Evet, Dapper'ın somut bir örneğini bulamadım, bunun için tam anlamıyla bulduğu yerde var dog = connection.Query<Dog>("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid });ve sonra dog.First().Ageözelliklere erişmek için.
Wayne Molina

5
Örnek anonim bir tür döndürmüyor, "var" anahtar sözcüğü fazladan yazmayı kaydetmek için C # içindeki somut bir tür yerine kullanılabilir, bu sorgu IEnumerable <Person> değerini döndürür.
Ed James

1
Asıl sebep, daha az ek yükün sürekli olarak sprocs'u kontrol etmesi ve ardından bazı iki düzine SQL dosyasını güncellemeyi hatırlamaktır, önemsiz CRUD kodu için procs depolamak zorunda kalmadan bahsetmek değildir.
Wayne Molina

2
Tüm kodları saklamak için sprocs kullanmamanın temel faydası (ve burada SQL ve diğer tercih ettiğiniz dilleri de dahil olmak üzere kodu kullanıyorum) aynı sürüm kontrol sisteminde. Henüz iyi bir çapraz veritabanı VCS veritabanıyla karşılaşmamıştım.
Ed James

Yanıtlar:


12

Yararları:

  • DataReader ve ayrıştırma ile ham SqlCommand benzer performans.
  • DataReader için kendi dönüşüm katmanınızı döndürmenize gerek yok.

Dürüst olmak gerekirse, işte bu kadar. Sizin için nesne dönüşümü yapacak sql bağlantılarınız için çok hafif bir sargınız var. Açıkçası, herhangi bir otomatikleştirilmiş SQL ile uğraşmak zorunda kalmadan sorguları hassas şekilde ayarlayabilirsiniz.

Eksileri:

  • Hafifçe güvende bile değil. SQL'de bir yazım hatası yaparsanız, CI sunucunuz onu yakalamayacaktır, otomatik UI veya işlev testi sırasında yakalanacağını ummanız gerekir.
  • Korumak için bir acı. DB mimarisiyle güçlü bağları olmayan çeşitli sorgular yapan bir grup satır içi SQL deyiminiz var. Bu durum, altta yatan DB yapısı değiştiğinde, "derleme sırasında görmeyeceğiniz" geride bırakılan sorguları oldukça kolay bir şekilde ortaya çıkarabilir.

Yerlerine sahipler ve DB ile etkileşime girdiklerinde geliştiricilerin bazı "eşek işlerini" kaldırabilecekleri çok etkili bir araç, ancak gerçekte tam bir ORM'nin büyük bir ölçekte yerini alamazlar. Bakım maliyetinin artması nedeniyle performans açısından kritik olmayan sorgular için sistem.

DB sorgularında performansla mücadele ediyorsanız, bu eşleştirme çerçevelerini SQL'in geçerli olup olmadığına dair derleme zamanı göstergesi (yalnızca ek performans avantajları) alabilmek için yalnızca Eşleme Prosedürleri ile birlikte kullanmanın daha iyi olacağını öneririm. .


Bu mikroorganizmalarda, yazım hataları ile bahsettiğiniz sorunu azaltabilecek sarıcı olarak kullanılabilecek kütüphaneler var. Örn: Dapper için Basit Crud eklentisi
Srivathsa Harish Venkataramana

3

Mikro ORM PetaPoco'nun web sitesinde diğer ORM ile bazı avantajları olduğunu açıkladı. daha fazla açıklamak

PetaPoco, .NET ve Mono için küçük, hızlı, tek dosyalı bir mikro ORM'dir.

  • Massive gibi herhangi bir projeye kolayca ekleyebileceğiniz tek bir dosyadır
  • Massive'in aksine, kesinlikle yazılmış POCO'lar ile çalışır.
  • Massive gibi, artık dinamik Expandos'u da destekliyor - devamını oku
  • ActiveRecord gibi, nesne ve veritabanı tablosu arasındaki yakın ilişkiyi destekler
  • SubSonic gibi, T4 şablonlarıyla poco sınıflarının oluşturulmasını destekler
  • Dapper gibi hızlıdır, çünkü özelliklere sütun değerleri atamak için dinamik yöntem oluşturma (MSIL) kullanır.

1

Bu, elle yazılmış bir ADO.NET veri katmanını kullanmaktan ne kadar farklıysa, komutu yazmak zorunda olmamanız dışında, parametreleri ayarlayın ve sanırım bir Oluşturucu kullanarak varlığı tekrar eşleştirin. Saklı yordam çağrısı bile SQL dizesi olarak kullanabiliyorsunuz gibi görünüyor.

Bunun bir Mikro-ORM'nin asıl faydası olduğuna inanıyorum, bir ORM'nin diğer avantajlarından yararlanmak için tam gelişmiş bir tane kullanmanız gerekir. Bu ve kod nispeten daha küçüktür, bu nedenle özelleştirmeniz gerekirse, bu daha kolay olacaktır.

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.