Entitäts-Framework mit SQL Server- und SQLite-Datenbanken gleichzeitig verwenden

9

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.ObjectQuery 1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Data.Entity.Internal.Linq.InternalQuery 1.GetEnumerator ()
  bei System.Data.Entity.Internal.Linq.InternalSet 1.GetEnumerator()
at System.Data.Entity.Infrastructure.DbQuery
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 ()
  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 ()

    
musefan 24.10.2013, 14:05
quelle

1 Antwort

0

Ü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.

    
Daniel Lorenz 04.01.2017 19:12
quelle