16

我有一个用于测试目的的 C# .Net 4.0 控制台应用程序(使用 VS 2012)。我的目标是能够创建一个可以在 MS SQL Server 数据库和 SQLite 数据库上使用的单一实体框架 .edmx 文件。基本上,我想使用相同的实体模型类和集合进行查询,但可以轻松地在两个不同的数据库之间随意切换。

到目前为止,我已经通过连接到 MS Server 数据库并添加了我的单个测试表(称为联系人)来创建我的 .edmx 文件。有了这个,我可以使用以下代码从我的表中获取数据:

var db = new DataAccess.ContactTestEntities();
foreach (var contact in db.Contacts)
    Console.WriteLine("" + contact.ID + ". " + contact.FirstName + " " + contact.LastName);

现在,我希望能够使用相同的代码,但改为连接到 SQLite 数据库。我编写了一个部分类,允许我在构造时更改连接字符串,如下所示:

var db = new DataAccess.ContactTestEntities("MY SQLITE CONNECTION STRING");

它在这方面工作正常,除非在尝试查询数据库时出现此错误:

无法将“System.Data.SQLite.SQLiteConnection”类型的对象转换为“System.Data.SqlClient.SqlConnection”类型。

我试图找到解决方案,但遇到了死胡同,我正在努力寻找下一步要采取的措施。

所以这是我的问题:我怎样才能克服这个问题?还是我可以采取另一种方法来获得相同的预期结果?


上述异常的堆栈跟踪:

在 System.Data.SqlClient.SqlCommand.set_DbConnection(DbConnection 值) 在 System.Data.Common.Utils.CommandHelper.SetStoreProviderCommandState(EntityCommand entityCommand, EntityTransaction entityTransaction, DbCommand storeProviderCommand) 在 System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior 行为)在 System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues) 在 System.Data.Objects.ObjectQuery 1.GetResults(Nullable1 forMergeOption) 在 System.Data.Objects.ObjectQuery 1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Data.Entity.Internal.Linq.InternalQuery1.GetEnumerator()
在System.Data.Entity.Internal.Linq.InternalSet1.GetEnumerator()
at System.Data.Entity.Infrastructure.DbQuery
1.System.Collections.Generic.IEnumerable.GetEnumerator() 在 SQLiteTest.Program.ReadFromSqlite() 在 c:\Development\Projects\Test Applications\SQLiteTest\SQLiteTest\Program.cs:SQLiteTest.Program.ReadTests() 的第 82 行在 c:\Development\Projects\Test Applications\SQLiteTest\SQLiteTest\Program.cs:第 63 行中的 SQLiteTest.Program.ProcessMenu() 在 c:\Development\Projects\Test Applications\SQLiteTest\SQLiteTest\Program.cs:第 36 行在 SQLiteTest.Program.Main(String[] args) in c:\Development\Projects\Test Applications\SQLiteTest\SQLiteTest\Program.cs:第 14 行,在 Microsoft .VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 在 System.Threading.ExecutionContext.Run System.Threading.ThreadHelper.ThreadStart() 处的(ExecutionContext executionContext、ContextCallback 回调、对象状态)

4

3 回答 3

3

使用 sqlite dbcontext 为 dbcontext 对象创建另一个类并使用相同的模型类。简单的原因是默认实体与 sqlserver db 一起使用。要使用 sqlite,您必须使用 sqlite dbcontext。

于 2019-05-01T22:11:26.960 回答
0

您可以使用Entity Framework Code First轻松实现此目的。Code First 方法不使用 .edmx 文件。您的实体(类)会自动映射到数据库表。

connectionstring您将在 app.config 文件中定义这两个s 并配置它们的 providers。现在您可以通过将所需的值传递connectionstring给 EF 在 DB 之间切换。

/* connection string for SQLite */
<add name="SQLiteConnection" connectionString="Data Source=MyDBName.sqlite" providerName="System.Data.SQLite" />

/* connection string for SQL Server */
<add name="SQLServerConnection" connectionString="Data Source=MyDB; Integrated Security=True" providerName="System.Data.SqlClient" />

有关详细信息,请参阅SQLite Code FirstEF 6 Code First

于 2020-04-15T22:13:18.713 回答
0

<connectionStrings>您是在应用程序设置部分中传递连接字符串还是连接字符串的名称?我相信问题正如你所描述的那样。它将提供程序默认为 System.Data.SqlClient。如果你想要 Sql Lite,你必须设置 providerName <connectionString>,然后将它的名称(属性)发送<connectionString>到 DbContext(它知道如何自动查找)。然后它应该使用新的 providerName 属性而不是 SqlClient。

于 2017-01-04T19:12:18.030 回答