Jakie są zalety „Micro-ORM”?

21

Patrzyłem na tak zwane „Micro ORM”, takie jak Dapper, i (w mniejszym stopniu, ponieważ opiera się na .NET 4.0) Ogromne, ponieważ mogą być łatwiejsze do wdrożenia w pracy niż w pełni ORM od czasu naszego obecnego systemu jest wysoce zależny od procedur przechowywanych i wymagałby znacznego refaktoryzacji do pracy z ORM, takim jak NHibernate lub EF. Jaka jest korzyść z używania jednego z nich w pełni funkcjonalnego ORM? Wydaje się, że jest to tylko cienka warstwa wokół połączenia z bazą danych, która wciąż zmusza cię do pisania surowego SQL - być może się mylę, ale zawsze mówiono mi, że powodem ORM jest przede wszystkim to, że nie musiałeś pisać SQL, to może być generowany automatycznie; szczególnie w przypadku łączenia wielu tabel i mapowania relacji między tabelami, co jest uciążliwe w czystym SQL, ale jest trywialne w przypadku ORM.

Na przykład patrząc na przykład Dappera:

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

Jak to się różni od korzystania ze sterowanej warstwy danych ADO.NET, z tym wyjątkiem, że nie musisz pisać polecenia, ustawiać parametrów i przypuszczam, że odwzorowałem obiekt z powrotem za pomocą Konstruktora. Wygląda na to, że można nawet użyć wywołania procedury składowanej jako ciągu SQL.

Czy są inne namacalne korzyści, których mi brakuje w przypadku, gdy zastosowanie Micro ORM ma sens? Naprawdę nie rozumiem, w jaki sposób oszczędza cokolwiek na „starym” sposobie korzystania z ADO.NET, może poza kilkoma liniami kodu - wciąż musisz napisać, aby dowiedzieć się, jaki SQL musisz wykonać (który może stać się włochaty) i nadal musisz mapować relacje między tabelami (część, w której najbardziej pomagają ORM ORHO).

Wayne Molina
źródło
+1: Nadal będziesz potrzebować języka zapytań bez względu na wszystko, więc równie dobrze możesz trzymać się czegoś znajomego, takiego jak linq lub sql, ale zwracanie typów anonimowych jak w twoim przykładzie nie wydaje się mapować modelu relacyjnego do konkretnej domeny Model. To wydaje mi się dziwne.
Steven Evers,
Tak, nie mogłem znaleźć konkretnego przykładu Dappera na stronie, ponieważ robi to dosłownie, var dog = connection.Query<Dog>("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid });a następnie dog.First().Agema dostęp do właściwości.
Wayne Molina,
5
Przykład nie zwraca typu anonimowego, słowa kluczowego „var” można użyć zamiast konkretnego typu w C #, aby zapisać dodatkowe typowanie, zapytanie to zwróci IEnumerable <Person>.
Ed James
1
Głównym powodem jest mniejsze obciążenie związane z ciągłym sprawdzaniem sproców, a następnie pamiętaj o aktualizacji około dwóch tuzinów plików SQL, nie wspominając już o konieczności przechowywania proc dla trywialnego kodu CRUD.
Wayne Molina,
2
Główną zaletą jest to, że nie używam sproków do przechowywania całego kodu (i używam tutaj kodu celowo, w tym SQL i innych wybranych języków) w tym samym systemie kontroli wersji. Jeszcze nie spotkałem dobrej bazy danych VCS z wieloma bazami danych.
Ed James,

Odpowiedzi:

12

Korzyści:

  • Podobna wydajność do surowego SqlCommand z DataReader i parsowaniem.
  • Nie ma potrzeby zwijania własnej warstwy konwersji dla DataReadera.

To właściwie wszystko, szczerze mówiąc. Masz bardzo lekkie opakowanie dla twoich połączeń sql, które zrobią dla ciebie konwersję obiektu. Oczywiście można precyzyjnie dostroić zapytania bez konieczności radzenia sobie z automatycznie generowanym SQL.

Cons:

  • Nawet nie jest bezpieczny. Jeśli popełnisz literówkę w kodzie SQL, którego serwer CI nie ma zamiaru złapać, musisz mieć nadzieję, że zostanie ona złapana podczas automatycznego interfejsu użytkownika lub testów funkcjonalnych.
  • Ból do utrzymania. Masz kilka wbudowanych instrukcji SQL, które wykonują różne zapytania, które nie mają silnych powiązań z architekturą DB. Może to dość łatwo prowadzić do zapytań, które zostają „pozostawione”, gdy zmienia się podstawowa struktura DB, czego ponownie nie zobaczysz podczas kompilacji.

Mają swoje miejsce i są bardzo skutecznym narzędziem, które może zabrać część „pracy osła” programistom podczas interakcji z DB, ale w rzeczywistości po prostu nie mogą zająć miejsca pełnej ORM w żadnej dużej skali system zapytań, które nie są krytyczne dla wydajności, po prostu ze względu na zwiększone koszty utrzymania.

Jeśli masz problemy z wydajnością zapytań DB, sugerowałbym, że lepiej byłoby użyć tych ram odwzorowania tylko z procedurami składowanymi, aby uzyskać informację o czasie kompilacji, czy Twój SQL jest poprawny (plus dodatkowe korzyści związane z wydajnością) .

Ed James
źródło
Istnieją biblioteki, które mogą być używane jako opakowanie dla tych mikro-ormów, co może zmniejszyć problem, o którym wspominacie z literówkami. Np .: Prosty dodatek
Crud
3

Na stronie internetowej mikro ORM PetaPoco wyjaśnił jakąś przewagę z innymi ORM. wyjaśnić więcej

PetaPoco to niewielka, szybka, jednoplikowa mikro-ORM dla platform .NET i Mono.

  • Podobnie jak Massive, jest to pojedynczy plik, który można łatwo dodać do dowolnego projektu
  • W przeciwieństwie do Massive działa z silnie napisanymi POCO
  • Podobnie jak Massive, teraz obsługuje również dynamiczne rozwinięcia - czytaj więcej
  • Podobnie jak ActiveRecord, obsługuje ścisły związek między obiektem a tabelą bazy danych
  • Podobnie jak SubSonic, obsługuje generowanie klas poco za pomocą szablonów T4
  • Podobnie jak Dapper, jest szybki, ponieważ wykorzystuje dynamiczne generowanie metod (MSIL) do przypisywania wartości kolumn do właściwości
Christophe Debove
źródło
1

Jak to się różni od korzystania ze sterowanej warstwy danych ADO.NET, z tym wyjątkiem, że nie musisz pisać polecenia, ustawiać parametrów i przypuszczam, że odwzorowałem obiekt z powrotem za pomocą Konstruktora. Wygląda na to, że można nawet użyć wywołania procedury składowanej jako ciągu SQL.

Uważam, że jest to główna zaleta Micro-ORM, aby uzyskać inne korzyści z ORM, będziesz musiał użyć pełnej wersji. To, a kod jest stosunkowo mniejszy, więc jeśli musisz go dostosować, byłoby łatwiej.

Czarny lód
źródło