【问题标题】:Using SQL Server CE 4 on a remote host with MVC 3在带有 MVC 3 的远程主机上使用 SQL Server CE 4
【发布时间】:2011-06-13 08:49:39
【问题描述】:

我刚刚将我的主机升级到 MVC 3,但我正在尝试使用 SQLCE 4.0 做一个“hello world”,但我刚刚得到:

抱歉,执行时出错 处理您的请求。

我看到了我的布局和所有内容,但我看到的不是数据。

在本地主机上按预期工作

我有:

<add name="PruebaContext" connectionString="Data Source=|DataDirectory|db.sdf" providerName="System.Data.SqlServerCE.4.0"/>

作为连接字符串。

我将 sdf 作为项目的一部分,我将 System.Data.SqlServerCE.dll 添加到项目中,本地副本 为 true。

我没有更多的想法。 connString, dll 在 /bin 并且在 localhost 中工作。

有什么想法吗?

谢谢。

编辑

我现在有一些日志:

没有 /bin 上的“System.Data.SqlServerCE.dll”:

找不到请求的 .Net Framework 数据提供程序。可能没有安装。

System.ArgumentException:找不到请求的 .Net Framework 数据提供程序。可能没有安装。

足够好。他们没有 SqlServerCE4。

使用本地副本上的 Dll,AKA /bin:

无法加载与版本 8482 的 ADO.NET 提供程序对应的 SQL Server Compact 本机组件。请安装正确版本的 SQL Server Compact。有关详细信息,请参阅知识库文章 974247。

异常详细信息:System.Data.SqlServerCe.SqlCeException:无法加载与版本 8482 的 ADO.NET 提供程序对应的 SQL Server Compact 本机组件。安装正确版本的 SQL Server Compact。有关详细信息,请参阅知识库文章 974247。

知识库说我需要 x86 和 amd64 的 dll。我在某处读到,如果我将两个目录复制到 /bin,例如: /bin/x86 和 /bin/amd64 。我从 SqlServerCE 4 安装文件夹的私有文件夹中复制了这些文件夹。现在我得到了:

在 ADO.NET 提供程序和 SQL Server Compact 的本机二进制文件之间检测到可能的文件版本不匹配,这可能导致功能不正确。这可能是由于存在多个不同版本的 SQL Server Compact 实例,或者由于与 SQL Server Compact 二进制文件同名的错误二进制文件。请安装匹配版本的 SQL Server Compact 二进制文件。

好的。在 SQLServerCE4 的根文件夹中,我也有一些 dll,因此我删除了这两个文件夹并将该 dll 复制到 /bin:

无法加载文件或程序集 'file:///C:\HostingSpaces\jesusrod\foxandxss.net\wwwroot\mvc3\bin\sqlceca40.dll' 或其依赖项之一。该模块应包含程序集清单。

我想我什么都试过了。 Scottgu 说 SqlServerCE 4 无需安装即可在任何服务器上运行。

【问题讨论】:

  • 查看事件日志。错误应该记录在那里。
  • 我不知道我是否看对了地方,但我的主机似乎没有日志系统。
  • Scott Gu 错了,我在完全非云环境中的许多地方都遇到过类似的问题。直接上Win2008。 :( 希望我能尽快弄清楚。
  • 链接 stackoverflow.com/questions/10739845/… 以防它也对其他人有用

标签: asp.net-mvc-3 sql-server-ce sql-server-ce-4


【解决方案1】:

我不喜欢回答我自己的答案,但经过几个小时的工作我有答案!

我们需要:

NuGet(比从程序文件中复制 dll 更好)

我们使用 NuGet 安装:

EFCodeFirst

SqlServerCompact

EFCodeFirst.SqlServerCompact

问题是 EF 需要另一个用于 SQL CE 4 的 dll (System.Data.SqlServerCe.Entity.dll),我们需要在 web.config 上进行一些配置:

  <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>

这样,一切正常。我已经看到了 5 个不同的错误,所以我们需要:

SQL CE 4 中的 2 个 dll、EF dll、web.config 中的配置和本机 dll(来自 NuGet 下载库的包目录)。

似乎 web.config 配置指向 SQL CE .dll 的具体版本,而 RTM 包的版本不同。我找不到具体的版本,所以我使用 NuGet 的 .dll。

就是这样,远程主机上的 SQL CE 4 + EF。

【讨论】:

  • 您好,我遇到了同样的问题,按照您解决的方法,但现在我收到了安全异常,您也收到了吗? I made a question here
  • 这个问题以前有效,但它不适合我。有效的是stackoverflow.com/questions/4762857/…
  • 试过了,效果很好。但我依赖于 Entity Framework CodeFirst CTP5,这不是我想要的项目。
  • @AlexandreBrisebois 这个答案很老了,如果你有 VS2010 SP1,只需转到项目/添加可部署依赖项。这将添加必要的东西。
  • 项目/添加可部署依赖项仅适用于 Web 项目
【解决方案2】:

只需使用菜单“Project/Add Deployable Dependencies...” 我不确定它是否仅适用于 Visual Studio 2010 SP 1。

【讨论】:

  • 它是 :) 现在看起来更容易了,但从未尝试过该选项。
  • 太棒了 - 曾花时间尝试添加/编辑配置文件,然后只需一个复选框即可完成所有操作!
  • 我在这个问题上苦苦挣扎了好几个小时——这正是解决它的方法——谢谢!
【解决方案3】:

您需要确保您的私有应用程序目录(例如 \bin)中除了托管的之外还有本机 SQL CE 4.0 dll。

从“C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v4.0\Private\amd64”(或 x86,如果您有 32 位应用程序)复制它们。

部署 MSVCR90.dll 也是明智之举,它也是清单文件。查看 C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v4.0 中的文档 有关所需 DLL 和重新分发的更多信息。

【讨论】:

  • 谢谢。我尝试使用 amd64 或 x86(不是同时)。我的问题解释了不匹配错误。尝试使用 Desktop 中的托管 .dll(使用 xml),尝试使用私有中的托管 dll,我得到“无法加载文件或程序集 'System.Data.SqlServerCe,版本 = 4.0.0.0 ...”。我认为我需要托管和本地的正确组合。该文件夹没有安装文档。关于 MSVCR90.dll 我在我的 C 盘上发现了 20 个 dll,哪个? (任何VS目录上都没有人)。谢谢!
  • 4.0 RTM 包括 Private 文件夹中的所有必需文件,包括 VC++ 运行时文件和清单。另请参阅此回复:stackoverflow.com/questions/3223359/…
  • ErikEJ 的回答非常好,但对我来说没有什么新鲜事......它找不到数据提供者。使用另一个 dll 它只是无法加载 managed.dll,因为清单不正确。使用 nuget(本机和托管)中的 SqlServerCompact 我得到无法加载 dll v4.0.0.0。当然,完全按照您的回应进行了尝试。找不到数据提供者框架。我停止我认为:P
  • 我缩小了问题的范围。直接使用 SQLServerCE 可以完美运行。如果我将它与 EntityFramework(CodeFirst 或创建 .edmx)一起使用,则无法找到请求的 .Net Framework 数据提供程序。相同的代码,相同的所有,只是更改对 EF 的直接访问(我在 /bin 上有 EntityFramework.dll)。有什么想法吗?
【解决方案4】:

这看起来是由在项目中留下多个中间数据位引起的问题,您在其中替换了包含的文件而没有清理。

我建议执行 Build->Clean all,然后确保所有引用都指向新的、正确的 DLL,然后确保没有旧文件或引用仍在您的任何位置项目。完成后尝试重建。

由于这是一个 hello world 项目,因此从头开始创建一个新项目并在其中包含正确的 dll 可能会更容易。

【讨论】:

  • 已经搞定了,项目是新的,我清理了,dll是正确的。我发布它,而不仅仅是复制它。
【解决方案5】:

尝试手动安装 SQL CE。

http://www.microsoft.com/download/en/details.aspx?id=17876

祝你好运。

【讨论】:

    【解决方案6】:

    我遇到了同样的问题。尝试在我的 goDaddy 帐户上使用代码优先的 SQL CE 4.0 应用程序。

    我开始根据上面的线程和其他教程处理各种 DLL 文件,但似乎没有任何效果。有什么东西不见了。然后我阅读了 Add Deployable Dependencies 响应。

    我这样做了,它创建了 _bin_deployableAssemblies 文件夹。然后,我从 bin 文件夹中删除了除核心项目的 DLL 之外的所有内容,并将 _bin_deployableAssemblies 中的所有内容复制到 bin 文件夹中。

    我清理了 goDaddy 应用程序 bin 文件夹中的所有内容并重新同步了文件。那行得通。应用程序加载,如果我对类进行 codefirst 更改,dbcontext 会为我重新创建数据库。当然,我不希望在生产中这样做,但我想知道一切正常。

    我确实尝试使用关于将 MVC 应用程序部署到托管环境的 ASP 教程(他们使用 Cytanium 托管作为他们的示例),但它在 GoDaddy 上对我不起作用。我不得不手动复制文件。

    谢谢大家。这对我来说是一个巨大的进步,让我能够轻松地继续使用 MVC 和 EF。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多