Kontakt

Performante Datenbankschichten mit Dapper in .NET 8 – Praxisbeispiel für robuste Industrie­anwendungen (mit Podcast)

Performante-Datenbankschichten-mit-Dapper-in-NET-8_Praxisbeispiel-für-robuste-Industrieanwendungen_ChatGPT-Image-10.-Sept.-2025,-22_10_26

Performante Datenbankschichten mit Dapper in .NET 8 – Praxisbeispiel für robuste Industrie­anwendungen (mit Podcast)

Keller IT – AI Podcast: Dapper vs. EF Core für Industrieanwendungen (13 min.)

In dieser Folge des Keller IT AI Business Podcasts diskutieren wir eine der fundamentalsten Fragen für .NET-Entwickler im industriellen Umfeld (Medizintechnik, Leitsysteme): Setzt man auf die rohe Geschwindigkeit eines Micro-ORMs wie Dapper oder auf die Sicherheit und den Komfort von Entity Framework (EF) Core?

Die Kernthemen der Diskussion:

  • Performance & Kontrolle: Warum Dapper in Echtzeitsystemen (SCADA/MES) durch minimalen Overhead und volle SQL-Kontrolle punktet.

  • Typsicherheit & Wartbarkeit: Wie EF Core durch stark typisierte LINQ-Abfragen Laufzeitfehler verhindert und das Refactoring erleichtert.

  • Sicherheitsrisiken: Die Gefahr von SQL-Injection bei manuellen Abfragen vs. die Standard-Absicherung durch EF Core.

  • Produktivität: Warum moderne EF Core Versionen für 95 % aller Anwendungsfälle performant genug sind und Entwicklungszeit sparen.

Fazit: Es gibt keine Pauschallösung. Während Dapper für kritische Millisekunden in der Datenverarbeitung unschlagbar bleibt, bietet EF Core das robustere Framework für langlebige und sicherheitskritische Softwarearchitekturen.

[00:00] Moderator: Willkommen zum Keller IT AI Business Podcast. Sie sind spezialisierter IT-Recruiter und suchen einen Experten als Freelancer, spezialisiert auf industrielle Datenübertragung und Visualisierung?

[00:15] Sprecher 1: Ja, und genau da, in diesen robusten Industrieanwendungen – also denken wir an Medizintechnik oder Leitsysteme – da ist diese schnelle, zuverlässige Datenverarbeitung absolut entscheidend. Und hier entzündet sich oft eine wirklich grundlegende Debatte unter .NET-Entwicklern.

[00:33] Sprecher 2: Absolut. Die Frage ist doch immer wieder: Setzt man auf die rohe Geschwindigkeit eines Micro-ORMs wie Dapper oder geht man eher auf die Sicherheit und den Komfort von etwas Größerem wie Entity Framework Core?

[00:50] Sprecher 1: Genau. Die Kernfrage ist doch: Ist diese maximale Performance es wirklich wert, auf Entwicklerkomfort und – ganz wichtig – Typsicherheit zu verzichten?

[01:03] Sprecher 2: Und ich werde heute argumentieren, dass in wirklich kritischen Systemen die Antwort darauf ein ganz klares Ja sein muss.

[01:15] Sprecher 1: Und ich werde da die Gegenposition einnehmen. Ich bin nämlich der Meinung, dass diese angebliche Überlegenheit von Dapper in der Performance oft die erheblichen Risiken überschattet – also was Wartbarkeit und die Sicherheit des Codes angeht. Die langfristige Stabilität einer Anwendung hängt von so viel mehr ab als nur von ein paar Mikrosekunden.

[01:38] Sprecher 2: Okay, aber fangen wir mal bei meinem Standpunkt an: In Systemen wie SCADA oder MES, wo wirklich Echtzeit-Datenströme verarbeitet werden müssen, ist Latenz einfach keine Option. Dapper als Micro-ORM ist im Grunde ja nur eine hauchdünne Abstraktionsschicht über der Datenbankverbindung. Es tut genau eine Sache, aber die macht es extrem gut: Es mappt Abfrageergebnisse auf C#-Objekte mit absolut minimalem Overhead.

[02:05] Sprecher 2: Wenn wir mit einem Befehl wie QuerySingleOrDefaultAsync arbeiten, dann schreiben wir optimiertes, natives SQL. Wir haben die volle Kontrolle über den Ausführungsplan und vermeiden jeglichen Ballast, den so ein Full-ORM mit sich bringt. Das Ergebnis ist eben maximale, vorhersagbare Performance.

[02:26] Sprecher 1: Ich sehe, warum diese Perspektive verlockend ist. Aber ich würde es ein bisschen anders formulieren: Diese „volle Kontrolle“ ist ein zweischneidiges Schwert. Ja, man schreibt SQL, aber man schreibt es eben als magische Zeichenketten direkt im C#-Code. Das ist ein perfektes Rezept für Laufzeitfehler durch Tippfehler, die ein Compiler niemals finden wird.

[02:50] Sprecher 1: Refactorings, also das Umbenennen einer Spalte in der Datenbank, werden zum absoluten Albtraum. Man muss manuell jede einzelne dieser Zeichenketten im Code aufspüren. Ein Full-ORM wie Entity Framework Core hingegen arbeitet mit stark typisierten LINQ-Abfragen. Hier prüft der Compiler die Logik bereits zur Entwicklungszeit. Das schließt eine ganze Klasse von Fehlern von vornherein aus.

[03:15] Sprecher 2: Das ist ein valider Punkt bezüglich der Typsicherheit. Aber er unterschätzt die Disziplin von erfahrenen Entwicklerteams. In Hochleistungsanwendungen ist diese klare Trennung von Daten und Geschäftslogik entscheidend. Die SQL-Queries sind oft stabil und ändern sich selten. Und die Lesbarkeit von purem SQL direkt im Code ist für jeden, der die Datenbank-Sprache beherrscht, oft direkter als irgendeine komplexe, verkettete LINQ-Abfrage.

[03:45] Sprecher 1: Da muss ich aber widersprechen. Diese angebliche Lesbarkeit ist trügerisch. Was passiert denn, wenn ein weniger erfahrener Entwickler eine parametrisierte Abfrage falsch zusammenbaut? Die Tür für SQL-Injection steht plötzlich sperrangelweit offen – ein Sicherheitsrisiko, das in industriellen Anwendungen absolut untragbar ist.

[04:05] Sprecher 1: Entity Framework Core schützt durch seine Abstraktion standardmäßig davor. Und die Behauptung, die Performance von EF Core sei ein Problem, ist heutzutage oft überholt. Moderne Versionen sind extrem optimiert und für 95 % aller Anwendungsfälle mehr als schnell genug. Für diese vermeintlich letzten 5 % Performancegewinn opfert man mit Dapper ein enormes Maß an Sicherheit und Produktivität.

[04:35] Sprecher 2: Zusammenfassend bleibe ich dabei: Wenn es um die Kernfunktionalität von kritischen Systemen geht, wo wirklich jede Millisekunde zählt, ist der direkte, kontrollierte Ansatz von Dapper die überlegene Wahl. Der Preis ist eine höhere Anforderung an die Sorgfalt, aber das ist es wert für die resultierende Robustheit und Geschwindigkeit.

[04:58] Sprecher 1: Und ich halte dagegen: Für die Langlebigkeit und Wartbarkeit von komplexer Industriesoftware ist ein System, das Fehler zur Kompilierzeit statt zur Laufzeit aufdeckt, Gold wert. Die Produktivitätsgewinne und die eingebaute Sicherheit von EF Core bieten einen strategischen Vorteil, der den Performance-Nachteil bei weitem überwiegt.

[05:25] Moderator: Die Wahl des richtigen Werkzeugs bleibt also eine Abwägungssache. Pure Geschwindigkeit gegen abgesicherte Entwicklerproduktivität. Das war’s vom Keller IT AI Business Podcast. Vergesst nicht, uns ein Like dazulassen!

In der Automatisierungstechnik – etwa in der Pharma- oder Medizintechnik – müssen Systeme nicht nur zuverlässig, sondern auch effizient mit großen Datenmengen umgehen können.
Eine häufige Herausforderung: schnelle und saubere Datenbankzugriffe, die in komplexen Projekten wie SCADA-, MES- oder Visualisierungssystemen zum Einsatz kommen.

In diesem Beitrag wird anhand eines Beispiels gezeigt, wie man mit .NET 8 und Dapper eine performante und zugleich wartbare Data-Access-Layer aufbaut – mit Fokus auf Lesbarkeit, Performance und Robustheit.

1. Ausgangssituation

Ein Produktionssystem speichert Chargeninformationen in einer SQL-Datenbank.
Ziel: Eine Repository-Methode entwickeln, die eine bestimmte Charge anhand ihrer ID ausliest.

Technologien:

  • .NET 8

  • C#

  • MS SQL Server

  • Dapper als Micro-ORM

2. Das Datenmodell

				
					/// <summary>
/// Represents a production batch entity.
/// </summary>
public class Batch
{
    public int BatchId { get; set; }
    public string ProductCode { get; set; } = string.Empty;
    public DateTime CreatedAt { get; set; }
    public string Status { get; set; } = string.Empty;
}

				
			

3. Repository-Methode mit Dapper

				
					using System.Data;
using Dapper;
using Serilog;

/// <summary>
/// Provides data access methods for batch entities.
/// </summary>
public class BatchRepository
{
    private readonly IDbConnection _connection;
    private readonly ILogger _logger;

    public BatchRepository(IDbConnection connection, ILogger logger)
    {
        _connection = connection;
        _logger = logger;
    }

    /// <summary>
    /// Retrieves a batch record by its ID.
    /// </summary>
    public async Task<Batch?> GetBatchByIdAsync(int batchId)
    {
        const string sql = "SELECT BatchId, ProductCode, CreatedAt, Status FROM Batches WHERE BatchId = @BatchId;";

        try
        {
            return await _connection.QuerySingleOrDefaultAsync<Batch>(sql, new { BatchId = batchId });
        }
        catch (Exception ex)
        {
            _logger.Error(ex, "Error retrieving batch with ID {BatchId}", batchId);
            throw;
        }
    }
}

				
			

4. Best Practices aus der Praxis

  • Saubere Trennung: Business-Logik und Datenbankzugriff klar getrennt

  • Fehlerbehandlung: Exceptions werden geloggt

  • Performance: Dapper ist leichtgewichtig und schnell

  • Lesbarkeit: Klare Abfragen, kein unnötiger Overhead

  • Dokumentation: XML-Kommentare für automatische Doku-Tools

5. Fazit

Mit wenigen Zeilen Code lässt sich eine robuste, wartbare und performante Datenbankschicht implementieren. Gerade in Projekten mit hohen Anforderungen an Sicherheit, Stabilität und Transparenz (Pharma, Medizintechnik, Schienenfahrzeuge) ist dieser Ansatz sehr wertvoll.

👉 Wenn Sie für Ihr Projekt einen spezialisierten Experten für .NET, Datenbanken und Schnittstellenentwicklung suchen:
Lassen Sie uns sprechen – 30 Jahre Erfahrung in der Industrieautomation.


Kostenfrei zur Verfügung gestellt von: Uwe E. Keller, Keller Hard & Software Beratung.