System.Data.SQLite и SubSonic 3: отлично работает в VS2008, но не в VS2010 - PullRequest
2 голосов
/ 17 июня 2011

В прошлом году я очень успешно использовал SubSonic 3 и SQLite в проекте VS2008 и был очень доволен результатами.Совсем недавно я попытался настроить SubSonic 3 и SQLite в проекте VS2010 и встретил внутреннее исключение при попытке создать новый SimpleRepository:

Инициализатор типа для System.Data.SQLite.SQLiteFactory 'выдал исключение

Чтобы убедиться, что я не схожу с ума, я попробовал точно такой же код и файл app.config в VS2008, и никаких проблем.Странно!

В настоящее время я использую 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);
        }
    }
}

Есть идеи?

Ответы [ 2 ]

4 голосов
/ 21 июня 2011

Я использую SubSonic 3 с Visual Studio 2010 и SQLite 1.0.66, и это работает. Однако есть несколько вещей, которые вы должны сделать:

  • Ваше приложение должно быть x86 (не AnyCPU), иначе вы получите исключение BadImageFormatException на 64-битных компьютерах
  • Вы должны изменить Target Framework с «Профиль клиента Framework 4.0» на «Framework 4.0»
  • Вы должны добавить (или изменить) это в свой файл app.config. SQLite не будет работать без флага useLegacyV2RuntimeActivationPolicy, установленного в true

    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    </startup>
    
  • Код инициализации My Factory выглядит следующим образом (он включает в себя 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>
    

Надеюсь, это поможет.

Обновление: Я вижу, вы используете версию SQLite для x64, так что забудьте о первой подсказке. Но я оставляю это, может быть, это полезно для других.

2 голосов
/ 17 июня 2011

Если я правильно помню, сообщение об ошибке «Инициализатор типа для ... выбросил исключение» обычно означает, что что-то в статическом конструкторе для типа бросило исключение.Возможно, вы захотите попробовать открыть System.Data.SQLite.SQLiteFactory в Reflector, dotPeek или JustDecompile или любом другом инструменте, который вы предпочитаете, и посмотреть, что делает его статический конструктор (.cctor).Есть ли у вас .NET 4 в VS2010 и .NET 2/3 в VS2008?Это тоже может быть частью проблемы.

...