FluentNhib + System.Data.SQLLite VS2010 - PullRequest
       9

FluentNhib + System.Data.SQLLite VS2010

1 голос
/ 08 сентября 2010

Я знаю, что этот вопрос был опубликован здесь раньше, и я просмотрел столько ответов, сколько смог найти, но я все еще не могу заставить работать самый простой в мире тест.

1)Я создал свой тест и убедился, что он работает в VS2008, а затем открыл решение в VS2010 (так что все определенно работает, и весь код 3.5 со всеми ссылками на сборки 2.0 / 3.0 / 3.5 ссылки)

2) Я добавил следующий конфиг

  <runtime>
    <loadFromRemoteSources enabled="true"/>
    <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>
  <startup useLegacyV2RuntimeActivationPolicy="true">
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>

3) Я попробовал провести тестирование против библиотек SqlLite 1.0.60.0 x86 и 1.0.66.0 x64

4) Я попытался запустить тесты в x86и x64 mode

Все еще не проходит.Что я пропустил?

(о, и я использую SQLite20Driver, а для параметра Копировать локально установлено значение true)

Тест представляет собой простой Configure ()

var cfg = Fluently.Configure(new NHibernate.Cfg.Configuration().Configure())
                       .Mappings(m => m.FluentMappings.AddFromAssemblyOf<UserMap>()
                           .Conventions.AddFromAssemblyOf<RequiredPropertyConvention>())
                       .BuildConfiguration();

var sessionFactory = cfg.BuildSessionFactory();

Ошибка

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

Stack Trace

   at NHibernate.Driver.ReflectionBasedDriver..ctor(String driverAssemblyName, String connectionTypeName, String commandTypeName)
   at NHibernate.Driver.SQLite20Driver..ctor()
   at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic)
   at System.Activator.CreateInstance(Type type)
   at NHibernate.Bytecode.ActivatorObjectsFactory.CreateInstance(Type type)
   at NHibernate.Connection.ConnectionProvider.ConfigureDriver(IDictionary`2 settings)
   at NHibernate.Connection.ConnectionProvider.ConfigureDriver(IDictionary`2 settings)
   at NHibernate.Connection.ConnectionProvider.Configure(IDictionary`2 settings)
   at NHibernate.Connection.ConnectionProviderFactory.NewConnectionProvider(IDictionary`2 settings)
   at NHibernate.Cfg.SettingsFactory.BuildSettings(IDictionary`2 properties)
   at NHibernate.Cfg.Configuration.BuildSettings()
   at NHibernate.Cfg.Configuration.BuildSessionFactory()

NHibernate Config

  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
      <property name="connection.driver_class">NHibernate.Driver.SQLite20Driver</property>
      <property name="connection.connection_string">Data Source=nhibernate.db;Version=3</property>
      <property name="dialect">NHibernate.Dialect.SQLiteDialect</property>
      <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
      <property name="query.substitutions">true=1, false=0</property>
    </session-factory>
  </hibernate-configuration>

1 Ответ

1 голос
/ 19 сентября 2010

Если вы переносите проект VS2008 на 2010 год или даже начинаете новый проект, есть вероятность, что ваш проект ссылается на стороннюю сборку, которая еще не была скомпилирована для платформы .NET 4 (пока). Чтобы заставить сборку V2.0 работать в среде .Net 4, вам нужно включить смешанный режим, добавив в ваш web.config / app.config следующее:

<configuration>
  <startup  useLegacyV2RuntimeActivationPolicy="true">
       <supportedRuntime version="v4.0"/>
  </startup>
</configuration>

useLegacyV2RuntimeActivationPolicy : Указывает среде выполнения связывать сборки, созданные на основе более старой версии .NET, с средой выполнения V4 вместо сред выполнения, с которыми они были построены (вынуждают их использовать V4)

поддерживаемое время выполнения : уведомление .NEt знать, что ваше приложение поддерживает среду выполнения V4 и загружать ваше приложение во время выполнения V4.

Для UnitTesting недостаточно добавить его в app.config проекта, содержащего TestFixtures. Вам необходимо добавить это в app.config приложения, в котором фактически выполняются тесты, поэтому для графического интерфейса NUnit его необходимо добавить в nunit.exe.config. Кроме того, вам необходимо убедиться, что вы используете NUnit версии 2.5.3+.

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <requiredRuntime version="v4.0" />
    <supportedRuntime version="v4.0"/>
  </startup>
  <runtime>
    <loadFromRemoteSources enabled="true" />
  </runtime>
</configuration>

loadFromRemoteSources : CAS устарел в .Net 4, и эта строка заставляет сборки V2 с частичным доверием запускаться с полным доверием.

requiredRuntime : Это связано с тем, что NUnit был создан для V2 среды выполнения, для загрузки в V4 необходимо указать, что он должен работать во время выполнения V4. (в отличие только от «поддержки»)

Если вы используете другой тестовый прогон, такой как тестовый прогон ReSharper, TestDriven.Net или тестовый прогон DXCore, вам необходимо убедиться, что вы изменили их app.config в соответствии с приведенным выше (или подождать сборки .Net 4 из них будут освобождены)

Наконец, если вы используете сторонние сборки, которые были скомпилированы специально для x86 (в основном это сборки, которые обертывают другие сборки C / C ++, такие как System.Data.SQLite), вам нужно либо получить 64-битные версии. из них (поскольку VS2010 по умолчанию компилируется в x64 при использовании любого процессора в качестве цели) или измените свою цель на x86.

...