mus*_*fan 9 c# sql-server sqlite entity-framework
我有一个用于测试目的的C#.Net 4.0控制台应用程序(使用VS 2012).我的目标是能够创建一个可以在MS SQL Server数据库和SQLite数据库上使用的单个Entity Framework .edmx文件.基本上,我想使用相同的实体模型类和集合进行查询,但很容易就能随意在两个不同的数据库之间切换.
到目前为止,我已经通过连接到MS Server数据库并添加我的单个测试表(称为Contact)创建了我的.edmx文件.有了这个,我可以使用以下代码从我的表中获取数据:
var db = new DataAccess.ContactTestEntities();
foreach (var contact in db.Contacts)
Console.WriteLine("" + contact.ID + ". " + contact.FirstName + " " + contact.LastName);
Run Code Online (Sandbox Code Playgroud)
现在,我希望能够使用相同的代码,而是连接到SQLite数据库.我编写了一个部分类,允许我更改contruction上的连接字符串,如下所示:
var db = new DataAccess.ContactTestEntities("MY SQLITE CONNECTION STRING");
Run Code Online (Sandbox Code Playgroud)
它在这方面工作正常,除了在尝试查询数据库时我收到此错误:
无法将类型为"System.Data.SQLite.SQLiteConnection"的对象强制转换为"System.Data.SqlClient.SqlConnection".
我试图找到一个解决方案,但已经走到了尽头,我正在努力寻找下一步.
这就是我的问题:我怎样才能解决这个问题?或者我可以采取另一种方法来获得相同的预期结果?
堆栈跟踪以上异常:
处于System.Data.Ents.Clmand.AntityClient.EntityCommandDefinition.ExecuteStoreCommands的System.Data.Common.Utils.CommandHelper.SetStoreProviderCommandState(EntityCommand entityCommand,EntityTransaction entityTransaction,DbCommand storeProviderCommand)中的System.Data.SqlClient.SqlCommand.set_DbConnection(DbConnection值)(EntityCommand entityCommand,的CommandBehavior行为)在System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute [TResultType](ObjectContext的上下文中,ObjectParameterCollection的parameterValues)在System.Data.Objects.ObjectQuery
1.GetResults(Nullable
1 forMergeOption)在System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Data.Entity.Internal.Linq.InternalQuery
1.GetEnumerator()
在System.Data.Entity.Internal.Linq.InternalSet1.GetEnumerator()
1.System.Collections.Generic.IEnumerable.GetEnumerator()在SQLiteTest.Program.ReadFromSqlite()在C:\开发\项目\测试应用程序\ SQLiteTest\SQLiteTest \的Program.cs:行82 SQLiteTest.Program.ReadTests()在C:\开发\项目\测试应用程序\ SQLiteTest\SQLiteTest \的Program.cs:行63 SQLiteTest.Program.ProcessMenu()在C:\开发\项目\测试应用程序\ SQLiteTest\SQLiteTest \的Program.cs:行36在SQLiteTest.Program.Main(字串[] args)在C:\发展\项目\测试应用\ SQLiteTest\SQLiteTest\Program.cs的:在System.AppDomain._nExecuteAssembly线14(RuntimeAssembly组件,字串[] args)在微软.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Data.Entity.Infrastructure.DbQuery
在System.Threading.ExecutionContext.RunInternal(的ExecutionContext的ExecutionContext,ContextCallback回调,对象的状态,布尔preserveSyncCtx)在System.Threading.ExecutionContext.Run(的ExecutionContext的ExecutionContext,ContextCallback回调,对象的状态,布尔preserveSyncCtx)在System.Threading.ExecutionContext.Run System.Threading.ThreadHelper.ThreadStart()中的(ExecutionContext executionContext,ContextCallback回调,对象状态)
您是否在应用程序设置部分传递连接字符串或连接字符串的名称<connectionStrings>
?我相信问题正如你所描述的那样。它将提供程序默认为 System.Data.SqlClient。如果你想要 Sql Lite,你必须设置providerName,<connectionString>
然后将其名称(属性)发送<connectionString>
到DbContext(它知道如何自动查找)。然后它应该使用新的providerName 属性而不是SqlClient。
归档时间: |
|
查看次数: |
2244 次 |
最近记录: |