Проблемы с использованием FluentNHibernate + SQLite с .NET4? - PullRequest
12 голосов
/ 23 апреля 2010

У меня есть приложение 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, Версия = 2.1.2.4000, Культура = нейтральная, PublicKeyToken = aa95f207798dfdb4.

и далее InnerException:

Не удалось найти реализацию IDbCommand и IDbConnection в сборке System.Data.SQLite. Убедитесь, что сборка System.Data.SQLite находится в каталоге приложения или в глобальном кэше сборок. Если сборка находится в GAC, используйте элемент в файле конфигурации приложения, чтобы указать полное имя сборки.

Теперь - для меня это звучит так, как будто не находит System.Data.SQLite.dll, но я не могу этого понять. Везде, где есть ссылка, у меня есть «Копировать локально», и я убедился, что он есть в каждой папке сборки для проектов, использующих SQLite. Я также скопировал его вручную в каждую папку Debug решения - без везения.

Примечания:

  • Это точно такой же код, который прекрасно работал до того, как я обновился до .Net4.
  • Ранее я видел некоторые проблемы несоответствия x64 x86, но я переключился на использование x86 в качестве целевой платформы и для всех упомянутых dll. Я проверил, что все файлы в папке отладки x86.
  • Я попробовал предварительно скомпилированные библиотеки Fluent, я попытался скомпилировать себя, и я скомпилировал свою собственную версию Fluent, используя .Net4.
  • Я вижу, что есть и другие, которые видели эту проблему , но я пока не нашел никакого решения.

После ответа @ devio я попытался добавить ссылку на dll SQLite. Это ничего не изменило, но я надеюсь, что все сделал правильно .. Вот что я добавил в корневой узел файла 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? Помогите! Я потерян ...

Ответы [ 7 ]

8 голосов
/ 04 мая 2010

Я также получил то же сообщение об ошибке при попытке использовать 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>

Мне не нужно добавлять зависимую сборку или что-либо внутри тега "runtime".Согласно этому тексту ссылки и этому тексту ссылки , его следует использовать только для помощи в миграции.Надеюсь, SQLite скоро будет обновлен.

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

7 голосов
/ 27 апреля 2010

Проверьте версию вашей ссылки 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 голосов
/ 18 июля 2010

Мне удалось решить эту проблему, изменив целевую платформу на x86 в настройках отладки проекта. Я использую vs2010.

2 голосов
/ 27 апреля 2010

У меня была похожая проблема с NH, VS2010, .Net4, но с драйверами Oracle ODP.Net и 32-битными.

Решением было объявить «квалифицированную сборку» в файле web.config с помощьюявный номер версии.См. Мое резюме .

Может быть, это решение относится и к вашей проблеме.

1 голос
/ 08 ноября 2011

Да, сэр: готов к работе с .NET 4 - Свободный NHibernate - NUnit

Используя информацию из приведенных выше постов, мне удалось заставить ее работать в Visual Studio 2010 и в моей библиотеке NUnit для тестирования, скомпилированной для любого процессора в режиме отладки.

Сначала я продолжал получать то же исключение, что и некоторые из вас:

Не удалось создать драйвер из NHibernate.Driver.SQLite20Driver, NHibernate, Версия = 3.1.0.4000, Культура = нейтральный, PublicKeyToken = aa95f207798dfdb4.

Я использовал NUGet для загрузки версии SQLite 1.0.76.0 для .NET версии 4.0.30319. Пост 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 Corporation. Все права зарезервирован.

Глобальный кэш сборок содержит следующие сборки:
System.Data.SQLite, версия = 1.0.76.0, культура = нейтральная, PublicKeyToken = db937bc2d44ff139, процессор архитектуры = AMD64

Количество предметов = 1

Обычно я бы использовал .NET Reflector из RedGate для извлечения информации о dll моего ранее добавленного NUget файла 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 и в унаследованном режиме - чтобы избежать возможных конфликтов в дальнейшем при использовании внутрипроцессной параллельной активации хоста - Google MSDN:

Когда более новая версия .NET Framework CLR загрузила сборку который был построен против предыдущей версии CLR, совместимость могут возникнуть проблемы, и приложение может перестать работать. это может произойти для любой управляемой сборки, как в полных приложениях, так и в плагинах (где управляемые сборки запускаются в контексте хост-приложение). Единственный способ гарантировать, что более новая версия .NET Framework не влияет на существующие приложения, чтобы иметь все существующие управляемые приложения работают в своей первоначальной цели скомпилированная версия .NET Framework.

Спасибо всем вам, ребята, за то, что вы указали мне правильное направление! Надеюсь, что после этого другим будет легче исправить эту проблему.

0 голосов
/ 07 сентября 2012

Я пробовал все решения на этой странице, но ничего не получалось. Затем я удалил свою 64-битную версию и использовал версию x86 от Nuget, и все заработало.

PM> Пакет установки System.Data.SQLite.x86

0 голосов
/ 17 января 2011

Не удалось создать драйвер из NHibernate.Driver.SQLite20Driver, NHibernate, Версия = 2.1.2.4000, Культура = нейтральная, PublicKeyToken = aa95f207798dfdb4

Решение:

Настройки теста:
выбрать хостов
выбрать запуск тестов в 64-битном процессе на 64-битной машине

...