Ich habe eine C # .Net 4.0-Konsolenanwendung für Testzwecke (mit VS 2012). Mein Ziel ist es, eine einzige Entity Framework-.edmx-Datei zu erstellen, die sowohl in einer MS SQL Server-Datenbank als auch in einer SQLite-Datenbank verwendet werden kann. Grundsätzlich möchte ich dieselben Entity-Model-Klassen und Collections für die Abfrage verwenden, kann aber leicht zwischen den beiden verschiedenen Datenbanken wechseln.
Bisher habe ich meine .edmx-Datei durch Verbindung zur MS-Server-Datenbank erstellt und meine einzige Testtabelle (Contact) hinzugefügt. Mit diesem kann ich dann den folgenden Code verwenden, um Daten aus meiner Tabelle zu erhalten:
%Vor%Nun möchte ich den gleichen Code verwenden können, aber stattdessen eine Verbindung mit einer SQLite-Datenbank herstellen. Ich habe eine partielle Klasse geschrieben, die es mir erlaubt, die Verbindungszeichenfolge bei construction wie folgt zu ändern:
%Vor%Es funktioniert in dieser Hinsicht gut, außer wenn ich versuche, die Datenbank abzufragen, bekomme ich diesen Fehler:
Das Objekt vom Typ 'System.Data.SQLite.SQLiteConnection' kann nicht in den Typ 'System.Data.SqlClient.SqlConnection' umgewandelt werden.
Ich habe versucht, eine Lösung dafür zu finden, bin aber in eine Sackgasse geraten und kämpfe um den nächsten Schritt.
Das ist meine Frage : Wie kann ich dieses Problem überwinden? Oder gibt es einen anderen Ansatz, den ich machen kann, um die gleichen gewünschten Ergebnisse zu erzielen?
Stack Trace für obige Ausnahme:
bei System.Data.SqlClient.SqlCommand.set_DbConnection (DbConnection Wert) um System.Data.Common.Utils.CommandHelper.SetStoreProviderCommandState (EntityCommand entityCommand, EntityTransaction entityTransaction, DbCommand storeProviderCommand) um System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands (EntityCommand entityCommand, CommandBehavior-Verhalten) um System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute [TResultType] (ObjectContext Kontext, ObjectParameterCollection parameterValues) um System.Data.Objects.ObjectQuery
1.GetResults(Nullable
1 forMergeOption) um System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Data.Entity.Internal.Linq.InternalQuery
1.GetEnumerator ()
bei System.Data.Entity.Internal.Linq.InternalSet1.GetEnumerator()
1.System.Collections.Generic.IEnumerable.GetEnumerator () bei SQLiteTest.Program.ReadFromSqlite () in c: \ Entwicklung \ Projekte \ Test Anwendungen \ SQLiteTest \ SQLiteTest \ Program.cs: Zeile 82 um SQLiteTest.Program.ReadTests () in c: \ Entwicklung \ Projekte \ Test Anwendungen \ SQLiteTest \ SQLiteTest \ Program.cs: Zeile 63 um SQLiteTest.Program.ProcessMenu () in c: \ Entwicklung \ Projekte \ Test Anwendungen \ SQLiteTest \ SQLiteTest \ Program.cs: Zeile 36 um SQLiteTest.Program.Main (String [] args) in c: \ Entwicklung \ Projekte \ Test Anwendungen \ SQLiteTest \ SQLiteTest \ Program.cs: Zeile 14 um System.AppDomain._nExecuteAssembly (RuntimeAssembly-Assembly, String [] args) bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly ()
at System.Data.Entity.Infrastructure.DbQuery
bei System.Threading.ExecutionContext.RunInternal (ExecutionContext executionContext, ContextCallback-Callback, Objektstatus, Boolean preserveSyncCtx) um System.Threading.ExecutionContext.Run (Ausführungskontext executionContext, ContextCallback-Callback, Objektstatus, Boolean preserveSyncCtx) um System.Threading.ExecutionContext.Run (Ausführungskontext executionContext, ContextCallback Callback, Objektzustand) um System.Threading.ThreadHelper.ThreadStart ()
Übergeben Sie im Abschnitt <connectionStrings>
app settings die Verbindungszeichenfolge oder den Namen der Verbindungszeichenfolge? Ich glaube, das Problem ist so, wie Sie es beschreiben. Der Provider wird standardmäßig auf System.Data.SqlClient festgelegt. Wenn du Sql Lite willst, musst du den providerName auf <connectionString>
setzen und dann den Namen (Attribut) dieses <connectionString>
an DbContext senden (Er weiß, wie man das automatisch nachschaut). Es sollte dann das neue providerName-Attribut anstelle von SqlClient verwenden.
Tags und Links sql-server c# entity-framework sqlite