System.Data.SQLite和SubSonic 3:在VS2008中运行良好,但在VS2010中运行不佳

时间:2011-06-17 03:12:46

标签: sqlite subsonic subsonic3 system.data.sqlite

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

  

的类型初始值设定项   'System.Data.SQLite.SQLiteFactory'   抛出异常

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

目前,我正在使用SubSonic 3.0.0.4和System.Data.SQLite 1.0.73.0(3.7.6.3)的x64版本(虽然我也尝试了32位版本。)我添加了两个DLL作为参考并将“Copy Local”设置为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);
        }
    }
}

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

我正在使用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>
    
  • 我的工厂初始化代码如下所示(包括Version和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,所以忘掉第一个提示。但我离开了,也许这对其他人有帮助。

答案 1 :(得分:2)

如果我没记错的话,“类型初始值设定项为...抛出异常”错误消息通常意味着该类型的静态构造函数中的某些东西引发了异常。您可能想尝试在Reflector或dotPeek或JustDecompile或您喜欢的任何工具中打开System.Data.SQLite.SQLiteFactory,并查看其静态构造函数(.cctor)正在执行的操作。你有VS在VS2010中使用.NET 4和在VS2008中使用.NET 2/3吗?这也可能是问题的一部分。