Подтвердить что ты не робот

Проблемы с использованием 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? Помогите! Я потерян...

4b9b3361

Ответ 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