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

Posted

技术标签:

【中文标题】ASP.NET MVC 4 + Entity Framework 6 + SQL Compact Edition 4.0 部署无需安装【英文标题】:ASP.NET MVC 4 + Entity Framework 6 + SQL Compact Edition 4.0 deployment no install 【发布时间】:2013-02-04 01:48:37 【问题描述】:

我正在尝试部署一个使用 Entity Framework 6(代码优先)和 SQL Compact 4.0 的基本 MVC 4 应用程序 在安装了 iis 的 Windows 7 的全新安装上(未安装 mvc 4 和 sql compact 4.0)。

我在 db 项目中安装了以下 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 文件夹中 我已经做到了。你知道 sqlce dll 是否应该放在 bin -> x86 文件夹中 是的,bin/x86 文件夹中的 x86 DLL 和 bin/AMD64 文件夹中的 x64 dll。您还需要一个 dbProviders 部分,请参阅我的博文:erikej.blogspot.com/2011/02/… dbProviders 配置解决了我的问题。谢谢@ErikEJ! 【参考方案1】:

我认为您真正想做的是管理 NuGet 包,以便为 EntityFramework 添加 SqlServerCompact 支持。只需右键单击您的引用和管理 NuGet 包。然后在对话框中搜索 SqlServerCompact。你应该看到这个:

添加这个应该添加上面答案中的等效字符串。我最终在 web.config (或 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>

抱歉,我迟到了大约一年,但希望这对其他人有所帮助。

【讨论】:

请记住,如果要部署到未安装 SQL CE 的服务器,则还需要部署本机二进制文件。最简单的方法是添加一个后期构建步骤以从 NuGet 包 NativeBinaries 文件夹中复制这些内容【参考方案2】:

这是我正在使用的有效配置。

我已经从 NuGet 添加了项目: 实体框架 (6.0.1) EntityFramework.SqlServerCompact (6.0.1) Microsoft Sql Server 精简版 (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>

【讨论】:

以上是关于ASP.NET MVC 4 + Entity Framework 6 + SQL Compact Edition 4.0 部署无需安装的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 4 数据网格

如何使用 Entity Framework ASP.Net MVC 5 删除多条记录? [关闭]

Asp.NET MVC 5 Entity Framework 中的对象名称“dbo.AspNetUsers”无效

Entity Framework的学习(ASP.NET MVC5的学习中的一部分)

如何在 ASP.NET MVC 5、Entity Framework 6 中使用流利的 API 映射表?

ASP .Net MVC 应用程序:当 db-entity(“课程”)的布尔属性(“已观看”)为真时如何向用户显示