ORM für C# (.NET): Überblick, Vergleich und Beispiele
Object-Relational Mapping (ORM) ist eine Technologie, die es Entwicklern ermöglicht, mit Datenbanken über objektorientierten Code zu arbeiten und dabei von SQL-Abfragen zu abstrahieren. Im .NET-Ökosystem gibt es mehrere beliebte ORM-Bibliotheken, jede mit ihren eigenen Stärken und Schwächen. In diesem Artikel betrachten wir drei Hauptwerkzeuge: Entity Framework Core, Dapper und NHibernate, vergleichen ihre Leistung, Benutzerfreundlichkeit und geben praktische Codebeispiele in C#.
1. Entity Framework Core (EF Core)
EF Core ist der offizielle ORM von Microsoft, der Nachfolger von Entity Framework 6. Er unterstützt die Ansätze Code First, Database First und Model First und bietet einen leistungsstarken LINQ-Anbieter für die Abfrageerstellung.
Vorteile:
- Hohe Abstraktion – minimaler SQL-Code.
- Automatische Migrationen und Verwaltung des Datenbankschemas.
- Unterstützung vieler Anbieter (SQL Server, PostgreSQL, SQLite, MySQL).
- Tiefe Integration mit ASP.NET Core.
Nachteile:
- Geringere Leistung bei komplexen Abfragen.
- Hoher Speicherverbrauch beim Laden verknüpfter Daten.
Codebeispiel:
// Modellpublic class Product{ public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; }}
// Kontextpublic class AppDbContext : DbContext{ public DbSet<Product> Products { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder options) => options.UseSqlServer("YourConnectionString");}
// Verwendungusing var db = new AppDbContext();var cheapProducts = db.Products .Where(p => p.Price < 100) .OrderBy(p => p.Name) .ToList();2. Dapper
Dapper ist ein leichtgewichtiger Micro-ORM, der vom Stack Overflow-Team entwickelt wurde. Es erweitert IDbConnection um Erweiterungsmethoden und arbeitet sehr nah an ADO.NET, was eine hohe Leistung gewährleistet.
Vorteile:
- Extrem schnell – fast wie reines ADO.NET.
- Minimaler Speicherverbrauch.
- Volle Kontrolle über SQL-Abfragen.
- Geeignet für High-Load-Systeme.
Nachteile:
- Keine automatische Generierung des Datenbankschemas.
- Notwendigkeit, SQL-Abfragen manuell zu schreiben.
- Kein Change Tracking (Änderungsverfolgung).
Codebeispiel:
using (var connection = new SqlConnection("YourConnectionString")){ var products = connection.Query<Product>( "SELECT * FROM Products WHERE Price < @Price ORDER BY Name", new { Price = 100 }); // Mehrere Ergebnisse using (var multi = connection.QueryMultiple("SELECT * FROM Products; SELECT * FROM Categories")) { var prods = multi.Read<Product>(); var cats = multi.Read<Category>(); }}3. NHibernate
NHibernate ist ein Port des beliebten Java-Frameworks Hibernate. Es bietet eine vollständige Implementierung eines JPA-ähnlichen Ansatzes mit leistungsstarkem Caching und Unterstützung für komplexe Vererbungshierarchien.
Vorteile:
- Ausgereiftes Caching-System (erste und zweite Ebene).
- Unterstützung von Lazy Loading, HQL (Hibernate Query Language).
- Flexible Konfiguration des Mappings über XML oder Fluent API.
- Gut geeignet für Legacy-Projekte.
Nachteile:
- Komplexe Konfiguration und steile Lernkurve.
- Langsamer als Dapper und EF Core bei einfachen Abfragen.
- Wird im Vergleich zu EF Core selten aktualisiert.
Codebeispiel:
Auch in der Bibliothek
Datenvalidierung in Java: Überblick über Bibliotheken und Ansätze
Redis-Client für Node.js: ioredis – ein leistungsstarkes Tool für die Arbeit mit Redis
Prometheus-Metriken in Node.js: Die Bibliothek prom-client für das Monitoring
Boost.Filesystem für C++: Komplette Anleitung mit Beispielen