Проблемы с использованием FluentNHibernate + SQLite с .NET4?
У меня есть приложение WPF, работающее с VS2010. Net3.5 с использованием Nhibernate с FluentNHibernate + SQLite, и все работает нормально.
Теперь я хочу изменить использование .Net4, но это стало более болезненным опытом, чем я ожидал. При настройке соединения я делаю это:
var cfg = Fluently.Configure().
Database(SQLiteConfiguration.Standard.ShowSql().UsingFile("MyDb.db")).
Mappings(m => m.FluentMappings.AddFromAssemblyOf<MappingsPersistenceModel>());
_sessionFactory = cfg.BuildSessionFactory();
Вызов BuildSessionFactory() вызывает исключение FluentConfigurationException:
При создании SessionFactory использовалась недопустимая или неполная конфигурация. Для получения более подробной информации просмотрите коллекцию PotentialReasons и InnerException.
Внутреннее исключение дает нам дополнительную информацию:
Не удалось создать драйвер из NHibernate.Driver.SQLite20Driver, NHibernate, Version = 2.1.2.4000, Culture = neutral, PublicKeyToken = aa95f207798dfdb4.
И далее InnerException:
Реализация IDbCommand и IDbConnection в сборке System.Data.SQLite не найдена. Убедитесь, что сборка System.Data.SQLite находится в каталоге приложения или в глобальном кэше сборок. Если сборка находится в GAC, используйте элемент в файле конфигурации приложения, чтобы указать полное имя сборки.
Теперь - мне кажется, что он не находит System.Data.SQLite.dll
, но я не могу этого понять. Везде, где это указано, у меня есть "Копировать локальную", и я проверил, что он находится в каждой папке сборки для проектов, использующих SQLite. Я также скопировал его вручную в каждую папку Debug решения - без везения.
Примечания:
- Это точно такой же код, который работал отлично, прежде чем я обновился до .Net4.
- Я видел некоторые проблемы с несоответствием x64 x86 раньше, но я переключился на использование x86 в качестве целевой платформы и для всех ссылочных DLL. Я проверил, что все файлы в папке Debug - x86.
- Я пробовал предварительно скомпилированные библиотеки Fluent, я попытался скомпилировать себя, и я скомпилировал свою собственную версию Fluent с использованием .Net4.
- Я вижу, что есть и другие, которые видели эту проблему, но я пока не видел никакого решения.
После ответа @devio я попытался добавить ссылку на dll SQLite. Это ничего не изменило, но я надеюсь, что я сделал все правильно. Это то, что я добавил в корневой файл node файла app.config:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly partialName="System.Data.SQLite" fullName="System.Data.SQLite, Version=1.0.60.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
</assemblyBinding>
</runtime>
Любой, кто успешно использует Fluent с .Net4 и SQLite? Помогите! Я потерян...
Ответы
Ответ 1
Проверьте версию ссылки на System.Data. Мне кажется, что System.Data.SqlLite не может найти версию IDbCommand и IDbConnection, которая была построена, с которой я подозреваю версию 2.0.0.0. Я подозреваю, что теперь вы обновили до .Net 4, вы ссылаетесь на System.Data версии 4.0.0.0.
Если это так, вы должны иметь возможность добавить перенаправление привязки для решения проблемы:
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Data" publicKeyToken="b77a5c561934e089"/>
<bindingRedirect oldVersion="2.0.0.0" newVersion="4.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
Ответ 2
У меня также получилось такое же сообщение об ошибке, когда я попробовал Fluent с .Net4 и SQLite, но когда я посмотрел более внимательно, я нашел другое сообщение об ошибке.
Не удалось загрузить тип System.Data.SQLite.SQLiteConnection, System.Data.SQLite.
System.IO.FileLoadException: сборка смешанного режима построена против версии "v2.0.50727" среды выполнения и не может быть загружена в среду выполнения 4.0 без дополнительной информации о конфигурации.
Итак, я сделал, чтобы добавить useLegacyV2RuntimeActivationPolicy = "true" в тег "startup", как это.
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
Мне не нужно добавлять dependAssembly или что-нибудь внутри тега "runtime". В соответствии с этим текстом и этим текстом ссылки его следует использовать для миграции только помощь. Так что, надеюсь, SQLite скоро будет обновлен.
Надеюсь, это поможет!
Karlkim
Ответ 3
У меня была аналогичная проблема с NH, VS2010,.Net4, но с драйверами Oracle ODP.Net и 32-разрядными.
Решением было объявить "квалифицированную сборку" в файле web.config с явным номером версии. См. Мой сводка.
Возможно, это решение относится и к вашей проблеме.
Ответ 4
Мне удалось решить эту проблему, изменив целевую платформу на x86 в настройке отладки проекта. Я использую vs2010.
Ответ 5
Да, сэр: Получил это для работы с .NET 4 - Fluent NHibernate - NUnit
Используя информацию из вышеуказанных сообщений, мне удалось заставить ее работать в Visual Studio 2010
и в моей библиотеке NUnit для тестирования, скомпилированной для любого процессора в режиме отладки.
Сначала я получил то же исключение, что и некоторые из вас:
Не удалось создать драйвер из NHibernate.Driver.SQLite20Driver, NHibernate, Version = 3.1.0.4000, Culture = neutral, PublicKeyToken = aa95f207798dfdb4.
Я использовал NUGet для загрузки версии SQLite 1.0.76.0 для v4.0.30319 в .NET. Сообщение Devios выше и его итоговая ссылка привели меня в тестирование assemblyBinding в моем файле App.config, рассказывая VS 2010, чтобы использовать правильную версию System.Data.SQLite для NHibernate. Вот что я добавил в свой App.Config:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly partialName="System.Data.SQLite"
fullName="System.Data.SQLite, Version=1.0.76.0,
Culture=neutral,
PublicKeyToken=db937bc2d44ff139"/>
</assemblyBinding>
</runtime>
Как я узнал, какие детали нужно добавить в App.config?
Я также предварительно установил статически связанную библиотеку версии SQLite.NET 4 с сайта SQLite в разделе загрузки. Это установило библиотеку SQLite на мой компьютер и добавило ее в глобальный кэш сборок - в свою очередь, предоставив мне информацию, необходимую мне для редактирования App.config с помощью командной строки Visual Studio 2010:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC > gacutil -l System.Data.SQLite Microsoft (R).NET Глобальная утилита кэширования сборок. Версия 4.0.30319.1 Авторское право (c) Корпорация Microsoft. Все права зарезервирован.
Глобальный кэш сборок содержит следующие сборки:
System.Data.SQLite, Версия = 1.0.76.0, Культура = нейтральная, PublicKeyToken = db937bc2d44ff139, processorArchitecture = AMD64
Число элементов = 1
Обычно я использовал .NET Reflector от RedGate для извлечения информации о dll моего ранее добавленного NUget файла DLL System.Data.SQLite, но gacutil -l System.Data.SQLite
в порядке, если вы уже установили SQLite в свою систему, это правильная версия.
Ранее я также получил исключение сборки в смешанном режиме:
Не удалось загрузить тип System.Data.SQLite.SQLiteConnection, System.Data.SQLite. System.IO.FileLoadException: сборка смешанного режима построен против версии "v2.0.50727" времени выполнения и не может быть загружен в среду выполнения 4.0 без дополнительной настройки информация.
Тогда, если бы я хотел использовать версию SQLIte.NET 2.0, я бы ввел следующее в свой App.config:
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
Но теперь, когда у меня есть версия SQLite.NET 4, мне не нужно запускать старую версию .NET 2 и в режиме устаревания - избегая потенциальных конфликтов в дальнейшем при использовании одновременной активации Host-by-Side Runtime в процессе работы - Google MSDN:
Когда более новая версия .NET Framework CLR загрузила сборку который был построен против предыдущей версии CLR, совместимость могут возникнуть проблемы, и приложение может перестать работать. Эта может произойти для любой управляемой сборки, как в полных приложениях, так и в в плагинах (где управляемые сборки выполняются в контексте хост-приложение). Единственный способ гарантировать, что более новая версия .NET Framework не повлияла на существующие приложения, все существующие управляемые приложения запускаются в исходной цели скомпилированная версия .NET Framework.
Спасибо всем, что вы, ребята, указали мне в правильном направлении!
Надеюсь, после этого нам будет легче решить эту проблему.
Ответ 6
Не удалось создать драйвер из NHibernate.Driver.SQLite20Driver, NHibernate, Version = 2.1.2.4000, Culture = neutral, PublicKeyToken = aa95f207798dfdb4
Решение:
Настройки теста:
выбрать хосты
выберите тесты запуска в 64-битном процессе на 64-битной машине
Ответ 7
Я пробовал каждое решение на этой странице, и ничего не работало. Затем я удалил свою 64-битную версию и использовал версию x86 от Nuget, и все сработало.
PM > Install-Package System.Data.SQLite.x86