sqlite - System.Data.SQLite 和 SubSonic 3 : Works great in VS2008, 但不在 VS2010 中

标签 sqlite subsonic subsonic3 system.data.sqlite

去年,我在 VS2008 项目中非常成功地使用了 SubSonic 3 和 SQLite,并对结果非常满意。就在最近,我尝试在 VS2010 项目中设置 SubSonic 3 和 SQLite,并在尝试实例化新的 SimpleRepository 时遇到内部异常:

The type initializer for 'System.Data.SQLite.SQLiteFactory' threw an exception

为了确保我没有发疯,我在 VS2008 中尝试了完全相同的代码和 app.config 文件,没有问题。奇怪!

目前,我正在使用 SubSonic 3.0.0.4 和 x64 版本的 System.Data.SQLite 1.0.73.0 (3.7.6.3)(尽管我也尝试了 32 位版本。)我添加了两个 DLL 作为引用并将“复制本地”设置为 TRUE。

我的 App.Config 如下所示:

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

  <connectionStrings>
    <add name="myDatabase" connectionString="Data Source=C:\DB\mydatabase.db3" providerName="System.Data.SQLite"/>
  </connectionStrings>

我的代码如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SubSonic.Repository;

namespace SubSonicSqliteTestConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            var repo = new SimpleRepository("myDatabase", SimpleRepositoryOptions.RunMigrations);
        }
    }
}

有什么想法吗?

最佳答案

我正在将 SubSonic 3 与 Visual Studio 2010 和 SQLite 1.0.66 一起使用,并且它可以工作。 但是,您必须做一些事情:

  • 您的应用程序必须是 x86(不是 AnyCPU),否则您会在 64 位计算机上收到 BadImageFormatException
  • 您必须将目标框架从“Framework 4.0 Client Profile”更改为“Framework 4.0”
  • 您必须将其添加(或修改)到您的 app.config 文件中。如果 useLegacyV2RuntimeActivationPolicy 标志设置为 true,SQLite 将无法工作

    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    </startup>
    
  • 我的工厂初始化代码如下所示(它包括版本和 PublicKeyToken)。我从我的开发机器上的 machine.config 文件中获得了此设置,我在该文件中运行了设置,并选择将 SQLite 集成到 Visual Studio 2010(来自 All Programs\SQLite 文件夹)。该文件位于@%WinDir%\Microsoft.NET\Framework\<FrameworkVersion>\CONFIG

    <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, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    
        </DbProviderFactories>
    </system.data>
    
  • 我的连接字符串在路径中包含斜杠而不是反斜杠,并且包含版本

    <connectionStrings>
        <add name="connectionstringname"
                   connectionString="Data Source=c:/temp/mydatabase.db;Version=3;"
                   providerName="System.Data.SQLite"/>
    </connectionStrings>
    

希望有帮助。

更新: 我看到您使用的是 x64 版本的 SQLite,因此请忘记第一个提示。但我留下它,也许对其他人有帮助。

关于sqlite - System.Data.SQLite 和 SubSonic 3 : Works great in VS2008, 但不在 VS2010 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6380961/

相关文章:

mysql - SubSonic 与 MySQL 提供商发生崩溃

c# - 嵌套 linq - 其中 x == 可枚举

mysql - SubSonic 生成命名空间,但我的网站无法识别它。

android - 如何将数据库打印为表格? (安卓,SQLite)

Android SQLite(一)没有这样的表

c - 如何使用 sqlite3 C API 插入多个 blob?

java克隆sqlite数据库文件

jquery - 内联网开发人员制作面向公众的网站的安全考虑因素?