Hintergrund zu verwenden:Wie Dapper dot net zwingen, seine Umsetzung von IDbCommand.ExecuteReader
ich dabei bin Dapper in eine bestehende Anwendung zu integrieren, die ein Vermächtnis DAL aus der DAAB von Jahren vergangen basierend hat . Dies ist eine ziemlich große Codebasis, daher muss sie inkrementell durchgeführt werden. Mein erster Versuch ist eine Methode, die einen Reader aufruft und eine Sammlung von Objekten bevölkert.
Was ich bemerke, ist, dass die Abfrageerweiterungsmethode scheinbar den IDbCommand.ExecuteReader aufruft und die ältere DAL-Implementierung anstelle der Dapper-Version aufgerufen wird.
Also meine Frage ist dies "Gibt es eine Möglichkeit, Dapper ausdrücklich zu zwingen, seine Implementierung von IDbCommand.ExecuteReader und nicht die ältere Version zu verwenden?"
Setup-Verbindung: Die offene Verbindung kommt aus dem vorhandenen Framework und es wickelt vollständig die IDbConnection-Schnittstelle und einige. Es gibt eine Menge Sicherheit, um diese Verbindung zu bekommen, und andere Zusätze, die das Wasser trüben.
private static XyDbConnection GetConnection()
{
return XyDbConnection.GetConnection(ExternalFieldDataConstants.ConnectionName.SecureRepositoryConnection);
}
Callsite: Nichts schrecklich hier geht gerade Einrichtung von Dapper in einem typischen Szenario
private void GetFieldMappingTableDapper()
{
const string commandText = @"
SELECT
OD.ObjectDefId,
OD.Name,
FM.LOBField,
FM.XPath,
FM.XPathDataType,
FM.legacyOnly,
BA.NAME BusinessAreaName
FROM [FieldMapping] FM
JOIN [ObjectDef] OD
ON OD.ObjectDefId = FM.ObjectDefId
JOIN [BusinessArea] BA
ON BA.BusinessAreaId = OD.BusinessAreaId";
using (var conn = GetConnection())
{
_mappingsCache = conn.Query<FieldMappingEx>(commandText).ToList();
}
}
Bilder sagen mehr als tausend Worte.
Nun, wenn ich (F11) in den Aufruf Schritt erhalte ich:
Und nun der interessanteste Teil der Aufruf des Legacy-Befehlsobjekt ist von Dapper. (es scheint)
Ich habe Dapper seit Jahren verwendet, sogar mit Oracle :) und das ist das erste Mal, dass ich jemals einen Hickup hatte, Zeitraum.
Danke, Stephen
Können Sie zeigen, welchen Code Sie anrufen? auch, was ist der Verbindungstyp hier? Ist es möglich, dass der Verbindungsanbieter hier etwas Verrücktes macht? Nein: Dapper kann nicht in Ihre bestehende DAL anrufen, also eine von: die falsche Methode wird an erster Stelle aufgerufen, oder die Verbindung macht etwas Verrücktes, oder was gerade passiert passiert an einem anderen Ort :) –
Zum Beispiel: dapper * hat kein * IDbCommand.ExecuteReader'; Es hat eine 'IDbConnection.ExecuteReader' Methode. Wenn Ihr Stammobjekt ein Befehl ist: Sie verwenden Dapper nicht an erster Stelle. –
Sie können nicht kompilieren, wenn Sie mehrdeutige Erweiterungsmethoden haben, also ist es nicht möglich, dass eine andere Methode Ihre beabsichtigte Verwendung der Dapper-Erweiterungsmethode, fyi, übertrumpft. – Graham