sqlite und sqlserver mit dapper

Ich benutze dapper mit SQL server, aber mit Sqlite für einige in Gedächtnis-Tests für meine Unit-Tests.

Ich habe eine class wie folgt

public class Test { public int ID {get;set;} public string Name } 

Wenn ich mit dapper mit einer SQL server-Verbindung abfange, funktioniert es gut.

Wenn ich mit dapper mit einer SQLite-Verbindung abfange, bekomme ich einen Typ-Cast-Fehler. Grundsätzlich muss ich die Art der ID ändern, um eine lange, anstatt int zu sein.

Ich möchte nicht mein Schema in SQL server ändern, also frage ich mich, ob es einen Workaround zum Szenario gibt. Ich habe versucht, Schaffung und ID-class mit impliziten Abgüssen zu lange / int, aber das scheitert auch, und ich bin aus Ideen!

Versuchen Sie, die sqlite-Tabelle zu erstellen, die die Länge für INTEGER auf 4 Bytes angibt. Vielleicht würde diese Frage auch helfen: Was ist der Unterschied zwischen SQLite Integer datatypen wie int, Integer, Bigint, etc.?

Dies dreht sich um die Tatsache, dass Dapper die GetValue-Methode auf der IDataRecord-interface verwendet. Die konkrete class im System.Data.SqlLite-Namespace wählt wahrscheinlich Werte anders als die von System.Data.SqlClient.

Wie @FelicePollano darauf hingewiesen, versuchen Sie, die Struktur der SQLLite-Tabelle zu ändern und sehen, ob das die konkrete class in System.Data.SqlLite verursacht, um es anders zuzuordnen.

Eine weitere Möglichkeit besteht darin, Ihre eigene Zuordnung mit dem FastExpando-object zu entfernen, das Dapper zurückgibt und es zwingt, den Wert in ein Int zu konvertieren.

 IEnumerable<dynamic> results = Conn.Query("Select ID from SomeTable"); var testValue = new Test { ID = Convert.ToInt32(Results[0].ID.ToString()) }; 

Nicht wirklich ein großer Fan davon, denn es könnte eine Menge Code-Änderungen erfordern, aber es kann funktionieren.

Bitte beachten Sie: Dieser Beispielcode kann eine exception auslösen, wenn die ID-Spalte keine Ganzzahl ist. Sie können TryParse verwenden, aber um der Kürze willen habe ich es nicht aufgenommen.