ASP.NET MVC 4 + Entity Framework 6 + SQL Compact Edition 4.0的部署无需安装

7
我正在尝试部署一个基本的MVC 4应用程序,该应用程序使用Entity Framework 6(Code First)和SQL Compact 4.0,在已安装IIS的干净的Windows 7上进行(未安装mvc 4和sql compact 4.0)。
我在数据库项目中安装了以下nuget包:
- EntityFramework(版本6.0.0-alpha2) - EntityFramework.SqlServerCompact(版本6.0.0-alpha2) - Microsoft.AspNet.Providers(版本1.2) - Microsoft.AspNet.Providers.Core(版本1.2) - Microsoft.SqlServer.Compact(版本4.0.8876.1)
在web.config中,我有以下配置:
<connectionStrings>
  <add name="[Name]" connectionString="Data Source=|DataDirectory|[FileName].sdf" providerName="System.Data.SqlServerCe.4.0" />
</connectionStrings>  

......................

<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
     <parameters>
        <parameter value="System.Data.SqlServerCe.4.0" />
     </parameters>
  </defaultConnectionFactory>
  <providers>
      <provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </providers>
</entityFramework>

Bin文件夹(sql ce文件在amd64和x86文件夹中):

  • [amd64]
  • [x86]
  • Antlr3.Runtime.dll
  • DotNetOpenAuth.AspNet.dll
  • DotNetOpenAuth.Core.dll
  • DotNetOpenAuth.OAuth.Consumer.dll
  • DotNetOpenAuth.OAuth.dll
  • DotNetOpenAuth.OpenId.dll
  • DotNetOpenAuth.OpenId.RelyingParty.dll
  • EntityFramework.dll
  • EntityFramework.SqlServer.dll
  • EntityFramework.SqlServer.xml
  • EntityFramework.SqlServerCompact.dll
  • EntityFramework.SqlServerCompact.xml
  • EntityFramework.xml
  • Microsoft.Web.Infrastructure.dll
  • Microsoft.Web.WebPages.OAuth.dll
  • Newtonsoft.Json.dll
  • ShipMedProto.DB.dll
  • ShipMedProto.DB.pdb
  • ShipMedProto.Web.dll
  • ShipMedProto.Web.pdb
  • System.ComponentModel.DataAnnotations.dll
  • System.Data.DataSetExtensions.dll
  • System.Data.SqlServerCe.dll
  • System.Data.SqlServerCe.Entity.dll
  • System.Net.Http.Formatting.dll
  • System.Web.Helpers.dll
  • System.Web.Http.dll
  • System.Web.Http.WebHost.dll
  • System.Web.Mvc.dll
  • System.Web.Optimization.dll
  • System.Web.Providers.dll
  • System.Web.Razor.dll
  • System.Web.WebPages.Deployment.dll
  • System.Web.WebPages.dll
  • System.Web.WebPages.Razor.dll
  • WebActivatorEx.dll
  • WebGrease.dll
  • WebMatrix.Data.dll
  • WebMatrix.WebData.dll

当我部署到干净的机器上时,我会收到以下错误消息:

无法找到所请求的.NET Framework数据提供程序。可能未安装。

在我的开发机器上,它正常工作。(我已经安装了sql ce)

你有什么线索,我做错了什么吗?


确保所有必需的二进制文件都已部署到 bin 文件夹中。 - ErikEJ
我已经确保了。你知道sqlce dlls是否应该放在bin -> x86文件夹中吗? - oskarkvamme
2
是的,在bin/x86文件夹中有x86 DLL,在bin/AMD64文件夹中有x64 DLL。您还需要一个dbProviders部分,请参见我的博客文章:http://erikej.blogspot.com/2011/02/using-sql-server-compact-40-with.html - ErikEJ
dbProviders配置解决了我的问题。谢谢@ErikEJ! - oskarkvamme
2个回答

5
我认为你真正想做的是管理NuGet packages,以便为EntityFramework添加SqlServerCompact支持。只需右键单击您的引用并管理NuGet packages。然后在对话框中搜索SqlServerCompact。你应该会看到这个: enter image description here 添加这个应该会添加与上面答案中相同的字符串。我最终在web.config(或如果您正在创建一个app,则为app.config)中得到了这个。
    <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
          <parameters>
            <parameter value="System.Data.SqlServerCe.4.0" />
          </parameters>
        </defaultConnectionFactory>
        <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>   
</entityFramework>   
<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.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
        </DbProviderFactories>   
</system.data>

抱歉,我晚了一年,但希望这能对其他人有所帮助。

这句话与IT技术无关。

请记住,如果您要部署到没有安装 SQL CE 的服务器上,您还需要部署本机二进制文件。最简单的方法是将一个后生成步骤添加到 NuGet 包 NativeBinaries 文件夹中以将它们复制过去。 - Dale Anderson

1
这是我正在使用的配置,可行。
我从NuGet中添加了以下项目: EntityFramework (6.0.1) EntityFramework.SqlServerCompact (6.0.1) Microsoft Sql Server Compact Edition (4.0.8876.1)。请注意,我没有将此程序集标记为本地复制。
我从SQLCE 4私有安装文件夹中添加了文件。
然后,我将我的配置设置如下:
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="SecureSend.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <runtime>
    <loadFromRemoteSources enabled="true" />
    <ThrowUnobservedTaskExceptions enabled="true" />
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="bin"/>
      <dependentAssembly>
        <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="6.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Data.SqlServerCe" publicKeyToken="89845dcd8080cc91" />
        <bindingRedirect oldVersion="0.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="System.Data.SqlServerCe.4.0" />
      </parameters>
    </defaultConnectionFactory>
    <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>
  </entityFramework>
  <connectionStrings>
    <add name="LocalUserContext" connectionString="Data Source=c:\temp\LocalUserDataStore.sdf" providerName="System.Data.SqlServerCe.4.0" />
  </connectionStrings>
  <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.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
    </DbProviderFactories>
  </system.data>
</configuration>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接