6

我有一个 ASP.NET MVC 应用程序,它通过实体框架使用 SQLite 数据库。一切都在 VS 2008 的本地开发网络服务器上运行。

但是,将 Web 应用程序部署到我的服务提供商会导致此错误:

[ArgumentException: Unable to find the requested .Net Framework Data Provider.  It may not be installed.]
   System.Data.Common.DbProviderFactories.GetFactory(String providerInvariantName) +1308959
   System.Data.EntityClient.EntityConnection.GetFactory(String providerString) +35

服务提供商评论说他们不支持 SQLite。我认为 SQLite 独立于服务提供商的设置,因为它是 App_Data 可部署的。

有没有人成功部署实体框架 + SQLite 的经验?

干杯,-pom-

4

3 回答 3

13

您不太可能再阅读此内容,但您的 app.config(或者,对您而言,web.config)中缺少以下内容:

<configuration>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite" />
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" 
           description=".Net Framework Data Provider for SQLite"
           type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
    </DbProviderFactories>
  </system.data>
</configuration>

具体来说,如果您在链接到您的网站的库中使用 sqlite,则必须将其添加到网站的配置文件中 - 而不是库! 这是因为您加载提供程序的方式:本质上,您是在运行时使用字符串“System.Data.SQLite”确定要加载的 dll,并使用条目程序集的设置来定位适当的提供程序.

编辑:顺便说一句,当您编写具有 sqlite 依赖关系的库时,您可以避免这种复杂性。您不需要DbProviderFactories在运行时使用来查找 sqlite;您也可以采用编译时依赖关系,这可以更容易管理。然后你可以忽略上面的 app.config 部分,而是替换所有实例:

DbProviderFactories.GetFactory("System.Data.SQLite").CreateConnection()

System.Data.SQLite.SQLiteFactory.Instance.CreateConnection()

如果这样做,您将使用普通库调用来创建连接,并且没有运行时选择 db 提供程序。这可能不太灵活,因为您不能再通过配置文件交换数据提供者,但对于许多库来说就足够了。不幸的是,如果你不控制库代码,这不是一个选择。

于 2009-07-11T07:44:23.640 回答
0

您是否尝试将所需的 DLL (s) 添加到应用程序的 bin 目录中?您可能想查看 Phil Haack 关于Bin Deploying ASP.NET MVC的文章,了解如何自动执行此操作。

于 2009-02-16T13:07:37.170 回答
0

SQLite 需要完全信任权限才能部署 ASP.NET 应用程序。许多共享托管服务提供商不允许这样做。你可能不想检查这个。

于 2010-08-15T14:27:20.463 回答