System.Data.SQLite и SubSonic 3: отлично работает в VS2008, но не в VS2010
В прошлом году я очень успешно использовал SubSonic 3 и SQLite в проекте VS2008 и был очень доволен результатами. Совсем недавно я пытался настроить SubSonic 3 и SQLite в проекте VS2010 и встретил внутреннее исключение при попытке создать новый SimpleRepository:
Инициализатор типа для 'System.Data.SQLite.SQLiteFactory' вызвал исключение
Просто чтобы убедиться, что я не схожу с ума, я попробовал точно такой же код и файл app.config в VS2008, и никаких проблем. Weird!
В настоящее время я использую SubSonic 3.0.0.4 и x64-версию System.Data.SQLite 1.0.73.0 (3.7.6.3) (хотя я также пробовал 32-битную версию.) Я добавил обе библиотеки DLL в качестве ссылки и установил " Скопировать Локальный
Мой 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 ответа
Я использую SubSonic 3 с Visual Studio 2010 и SQLite 1.0.66, и это работает. Однако есть несколько вещей, которые вы должны сделать:
- Ваше приложение должно быть x86 (не AnyCPU), или вы получаете BadImageFormatException на 64-битных машинах
- Вы должны изменить Target Framework с "Клиентского профиля Framework 4.0" на "Framework 4.0"
Вы должны добавить (или изменить) это в свой файл app.config. SQLite не будет работать без установленного в true флага useLegacyV2RuntimeActivationPolicy
<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup>
Мой код инициализации Factory выглядит следующим образом (он включает в себя Version и PublicKeyToken). Я получил эти настройки из файла machine.config на моем компьютере разработчика, на котором я запустил установку и выбрал интеграцию SQLite в Visual Studio 2010 (из папки "Все программы \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, так что забудьте о первой подсказке. Но я оставляю это, может быть, это полезно для других.
Если я правильно помню, сообщение об ошибке "Инициализатор типа для... выбросил исключение" обычно означает, что что-то в статическом конструкторе для типа вызвало исключение. Вы можете попробовать открыть System.Data.SQLite.SQLiteFactory
в Reflector или dotPeek или JustDecompile или любом другом инструменте, который вы предпочитаете, и посмотрите, что делает его статический конструктор (.cctor). Есть ли у вас.NET 4 в VS2010 и.NET 2/3 в VS2008? Это тоже может быть частью проблемы.