SQL Server CE 上的实体框架,无需安装驱动程序
Posted
技术标签:
【中文标题】SQL Server CE 上的实体框架,无需安装驱动程序【英文标题】:Entity Framework on SQL Server CE without driver install 【发布时间】:2012-04-24 14:47:44 【问题描述】:我正在使用 Entity Framework 4 和 SQL Server CE 数据库 3.5 开发 WPF 应用程序,它工作正常。
但是我想让这个应用程序在安装了 .Net Framework 4 但没有SQL Server Compact 3.5
驱动程序的机器上运行。而且没有安装程序。有可能吗?
我尝试了以下方法:
在 app.config 中创建一个部分
<configuration>
<connectionStrings>
<add name="DbEntities"
connectionString="metadata=res://*/Model.Model1.csdl|res://*/Model.Model1.ssdl|res://*/Model.Model1.msl;provider=System.Data.SqlServerCe.3.5;provider connection string="Data Source=|DataDirectory|\Data\Database1.sdf""
providerName="System.Data.EntityClient"/>
</connectionStrings>
<system.data>
<DbProviderFactories>
<add name="SQL Server Compact Edition Data Provider"
invariant="System.Data.SqlServerCe"
description=".NET Framework Data Provider for Microsoft SQL Server Compact Edition"
type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=9.0.242.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
</DbProviderFactories>
</system.data>
</configuration>
添加对System.Data.SqlServerCe
和System.Data.SqlServerCe.Entity
的引用并允许本地复制
在未安装 SQL Server CE 驱动程序的机器上构建应用程序并将其复制。在创建数据上下文时,我不断收到此错误:
System.ArgumentException:在配置中找不到指定的商店提供程序,或者无效。 ---> System.ArgumentException:找不到请求的 .Net Framework 数据提供程序。可能没有安装。
我在浪费时间吗?还是我应该切换到 SQLite?
谢谢!
编辑:
感谢 josemiguel.torres 的回答,我查看this post 详细说明了如何实现这一点。但是,我仍然有一个组装错误。
"System.IO.FileLoadException: Could not load file or assembly 'System.Data.SqlServerCe, Version=3.5.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference.
(Exception from HRESULT: 0x80131040)"
所以我查看了 this other post 解释如何解决此问题。 添加一些程序集绑定后:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Data.SqlServerCe" publicKeyToken="89845dcd8080cc91" culture="neutral"/>
<bindingRedirect oldVersion="3.5.1.0-3.5.1.50" newVersion="3.5.1.50"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
还是不行……:| 错误信息类似:
System.IO.FileLoadException: Could not load file or assembly 'System.Data.SqlServerCe, Version=3.5.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
文件名:'System.Data.SqlServerCe, Version=3.5.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91'
我没有解决办法。有人吗?
编辑 2:
1.我已经从我的机器上卸载了所有的微软“SQL Server Compact Edition”版本。
2.我检查了 machine.config 版本:DbProviderFactories 部分中没有条目。
3.我从there下载了3.5 SP2驱动并安装了x86包。
4.我检查了我的 machine.config (v4 x86),并在 DbProviderFactories 节点下创建了以下条目:
<add name="Microsoft SQL Server Compact Data Provider" invariant="System.Data.SqlServerCe.3.5" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=3.5.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
为什么是 3.5.0.0 而不是 3.5.1.50???
以防万一:我的开发机器是 Win7 x64,目标机器是 WinXP x86。
【问题讨论】:
查看这个帖子blogs.msdn.com/b/stevelasker/archive/2008/10/22/… 它看起来更好但是我仍然有一个组装错误。 检查您的项目平台是否设置为“x86”。此问题可能来自您的 app.config。检查连接字符串。 它看起来像是我在编辑中详述的程序集绑定问题。 您使用的是 3.5 SP2 文件吗? 【参考方案1】:安装3.5 SP2,修改app.config如下:
<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="ChinookEntities" connectionString="metadata=res://*/Chinook.csdl|res://*/Chinook.ssdl|res://*/Chinook.msl;provider=System.Data.SqlServerCe.3.5;provider connection string="Data Source=C:\Users\erik.COMMENTOR\Documents\Visual Studio 2010\Projects\SqlCeTest\Chinook.sdf"" providerName="System.Data.EntityClient" />
</connectionStrings>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SqlServerCe.3.5" />
<add name="Microsoft SQL Server Compact Data Provider 3.5" invariant="System.Data.SqlServerCe.3.5" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=3.5.1.50, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
</DbProviderFactories>
</system.data>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly xmlns="">
<assemblyIdentity name="System.Data.SqlServerCe" publicKeyToken="89845dcd8080cc91" culture="neutral" />
<bindingRedirect oldVersion="3.5.1.0-3.5.1.50" newVersion="3.5.1.50" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
确保使用 C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v3.5\Private 文件夹中的 System.Data.SqlServerCe.dll 和 System.Data.SqlServerCe.Entity.dll
【讨论】:
由于某种原因,我安装 SP2 后 DbProviderFactories 版本不匹配。见编辑 2。 我正在使用私有子文件夹中的文件 在 machine.config 中应该是 3.5.1.0 - 并确保安装了 SP2 的 x86 和 x64 运行时(非常重要) 它是位于“C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config”的 machine.config 中的 3.5.1,但在“C:\Windows\Microsoft. NET\框架\v4.0.30319\配置”。这是故意的吗? 不应该是 3.5.1.0,确保你安装了 x64 和 x86 运行时 (2 x MSI)【参考方案2】:我放弃了 SQL CE 3.5 并切换到 4.0。感谢this article,它工作正常。 谢谢埃里克 ;)
【讨论】:
以上是关于SQL Server CE 上的实体框架,无需安装驱动程序的主要内容,如果未能解决你的问题,请参考以下文章
是否可以使用实体框架在 SQL Server CE 中实现 CommitMode.Immediate
如何让实体数据模型与 SQL Server CE 4.0 一起使用?
从 Edmx 构建的预编译实体框架 4 面向 SQL Server Safe 与 SQL CE 一起使用?
如何使用实体框架打开受密码保护的 SQL Server CE 数据库
从 SQL Server CE 切换到 SQL Server Express 实体问题
使用带有实体框架代码优先和 ASP.NET MVC 3 和 mvc miniprofiler 的 SQL Server CE 时出现问题