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=&quot;Data Source=|DataDirectory|\Data\Database1.sdf&quot;" 
               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.SqlServerCeSystem.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=&quot;Data Source=C:\Users\erik.COMMENTOR\Documents\Visual Studio 2010\Projects\SqlCeTest\Chinook.sdf&quot;" 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 时出现问题