实体框架代码首次迁移在错误的提供程序上失败(3.5而不是4.0)

时间:2014-02-19 08:48:42

标签: sql-server-ce ef-migrations

我正在尝试使用Entity Framework 6.0.2 for SQL Server Compact(代码优先)向项目添加迁移(第一次)。应用程序与数据库通信没有问题。迁移失败,并显示错误消息:

  

System.InvalidOperationException:
  没有为ADO.NET提供程序找到具有不变名称“System.Data.SqlServerCe.3.5”的实体框架提供程序。确保提供程序已在应用程序配置文件的“entityFramework”部分中注册。

项目从来没有引用过SqlServerCe.3.5,我找不到Visual Studio找到的那个&替换命令

app.config文件包含:

<configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Data.SqlServerCe" publicKeyToken="89845dcd8080cc91" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.0.1" newVersion="4.0.0.1" />
      </dependentAssembly>
  </assemblyBinding>
</runtime>
<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
    <parameters>
      <parameter value="System.Data.SqlServerCe.4.0" />
    </parameters>
  </defaultConnectionFactory>
</entityFramework>
<appSettings>
<system.data>
  <DbProviderFactories>
    <remove invariant="System.Data.SqlServerCe.4.0" />
    <add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.1, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
  </DbProviderFactories>
</system.data>

有谁知道如何强制迁移使用SqlServerCe.4.0(+/-删除对3.5的引用)?谢谢。

修改

非常感谢Sql Server Compact先生(ErikEJ)的建议。

不幸的是,删除绑定重定向节点只会导致:

  

System.Data.Entity.Core.ProviderIncompatibleException:   从数据库获取提供程序信息时发生错误。这可能是由实体框架使用不正确的连接字符串引起的。检查内部异常以获取详细信息,并确保连接字符串正确。 ---&GT; System.Data.Entity.Core.ProviderIncompatibleException:提供程序未返回ProviderManifestToken字符串。 ---&GT; System.ArgumentException:给定的连接不是'SqlCeConnection'类型。

您完全正确 - 此项目正在使用私有部署。 System.Data.SqlServerCe和System.Data.SqlServerCe.Entity的引用程序集版本都是4.0.0.1

编辑2 - 解决了

我需要删除绑定重定向节点,如erik建议的那样,并将提供程序添加到app config的EntityFramework节点(应用程序使用提供程序服务的基于代码的配置,因此不包括这些),如下所示

<providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
  <provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" />
</providers>

2 个答案:

答案 0 :(得分:1)

删除绑定重定向。看起来您正在尝试使用私有部署,但是您使用的是正确的System.data.SqlServerCe.dll(请检查程序集版本)。如果它是4.0.0.0而不是4.0.0.1,则更改为DbProviderfactories设置以指向正确的程序集版本

答案 1 :(得分:0)

我只花了半天时间试图让SqlServerCe 4.0 SP1又名4.0.0.1在没有异常的情况下工作。 终于解决了,希望它能帮助别人。

  1. here或通过网络平台安装程序
  2. 安装SqlServerCe 4.0 SP1
  3. 复制&#34;程序文件(x86)\ Microsoft SQL Server精简版\ v4.0 \ Private&#34;您的网络应用的amd64x86bin文件夹,并将它们包含在项目中(以便它们可以部署)enter image description here

  4. 不要复制&#34; System.Data.SqlServerCe.dll&#34;和&#34; System.Data.SqlServerCe.Entity.dll&#34;

  5. nuget&#34; Microsoft.SqlServer.Compact&#34;安装而不是过时的&#34; SqlServerCompact&#34;
  6. 项目引用不包含System.Data.SqlServerCe,但是在项目清理/构建过程之后它将存在于bin文件夹中
  7. web.config
  8. 上面的答案是有效的但是#34;版本= 4.0.0.1&#34;没有为我工作,而只是&#34; 4.0&#34;

    <system.data>
        <DbProviderFactories>
          <remove invariant="System.Data.SqlServerCe.4.0" />
          <add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
        </DbProviderFactories>
    </system.data>