Конфигурация SQLite NHibernate с .Net 4.0 и 2010 - PullRequest
4 голосов
/ 16 апреля 2010

Я обновляю этот пост тем, что, как мне кажется, теперь я знаю о получении этой конфигурации; ОДНАКО, есть еще что знать, так как у меня все еще есть проблема, это одна из важнейших областей.

Я использую SQLite для модульного тестирования, которое теперь работает нормально, используя шаги конфигурации ниже. Я также использую его, когда хочу выполнить тестовый интерфейс пользовательского интерфейса с большим количеством данных, чем тестовые данные в памяти, но без дополнительных затрат SQLServer - эта конфигурация завершается ошибкой со следующим:

{"Could not create the driver from NHibernate.Driver.SQLite20Driver, NHibernate, Version=2.1.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4."}

Вот обновленная информация о конфигах, которые работают:

1) Какой SQLite dll ?? Есть несколько плохих ссылок, которые выглядят полезными, но в них есть ошибки сборки . только хорошая загрузка на эту дату здесь в Source Forge . v1.066, который был выпущен сегодня, 4-18-2010.

2) Должны ли вы использовать GAC? Нет, как ответил Маурисио.

3) x64 builds - в ответ Маурисио.

4) Драйвер NHib - SQLite20Driver, на что ответил Маурисио

5) FNH как потенциальный конфликт - нет, как ответил Маурисио

Приветствия
Berryl

== ДОБАВИТЬ ИНФОРМАЦИЮ ОТЛАДКИ ===

Когда срабатывает исключение, и я вызываю сборку SQLite20Drive, я получаю следующее, что подсказывает мне, что драйвер должен быть доступным. Мне интересно, хотя, поскольку код конфигурации находится в другой сборке.

- сборка при ошибке ----

    ?typeof(SQLite20Driver).Assembly
{NHibernate, Version=2.1.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4}
[System.Reflection.RuntimeAssembly]: {NHibernate, Version=2.1.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4}
CodeBase: "file:///C:/Users/Lord & Master/Documents/Projects/Smack/trunk/src/ConstructionAdmin.WpfPresentation/bin/Debug/NHibernate.DLL"
EntryPoint: null
EscapedCodeBase: "file:///C:/Users/Lord%20%26%20Master/Documents/Projects/Smack/trunk/src/ConstructionAdmin.WpfPresentation/bin/Debug/NHibernate.DLL"
Evidence: {System.Security.Policy.Evidence}
FullName: "NHibernate, Version=2.1.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4"
GlobalAssemblyCache: false
HostContext: 0
ImageRuntimeVersion: "v2.0.50727"
IsDynamic: false
IsFullyTrusted: true
Location: "C:\\Users\\Lord & Master\\Documents\\Projects\\Smack\\trunk\\src\\ConstructionAdmin.WpfPresentation\\bin\\Debug\\NHibernate.dll"
ManifestModule: {NHibernate.dll}
PermissionSet: {<PermissionSet class="System.Security.PermissionSet"
version="1"
Unrestricted="true"/>
}
ReflectionOnly: false
SecurityRuleSet: Level1

--- сборка при модульном тестировании (НЕТ ОШИБКИ)

{NHibernate, Version=2.1.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4}
[System.Reflection.RuntimeAssembly]: {NHibernate, Version=2.1.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4}
CodeBase: "file:///C:/Users/Lord & Master/Documents/Projects/Smack/trunk/src/ConstructionAdmin.Tests/bin/Debug/NHibernate.DLL"
EntryPoint: null
EscapedCodeBase: "file:///C:/Users/Lord%20%26%20Master/Documents/Projects/Smack/trunk/src/ConstructionAdmin.Tests/bin/Debug/NHibernate.DLL"
Evidence: {System.Security.Policy.Evidence}
FullName: "NHibernate, Version=2.1.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4"
GlobalAssemblyCache: false
HostContext: 0
ImageRuntimeVersion: "v2.0.50727"
IsDynamic: false
IsFullyTrusted: true
Location: "C:\\Users\\Lord & Master\\Documents\\Projects\\Smack\\trunk\\src\\ConstructionAdmin.Tests\\bin\\Debug\\NHibernate.dll"
ManifestModule: {NHibernate.dll}
PermissionSet: {<PermissionSet class="System.Security.PermissionSet"

версия = "1" Неограниченные = "истинный" /> } ReflectionOnly: ложь SecurityRuleSet: Level1

Вот загрузчик для этого сеанса SQLite:

    /// <summary>SQLite-NHibernate bootstrapper for general use.</summary>
public class SQLiteBoot : IDisposable
{
    public readonly ISessionFactory SessionFactory;
    private readonly ISession _session;
    private static Configuration _config;
    private static string _persistenceModelGeneratorName;

    public SQLiteBoot(IAutoPersistenceModelGenerator persistenceModelGenerator) {
        if (_isSessionFactoryBuildRequired(persistenceModelGenerator)) {
            _config = new Configuration()
                .SetProperty(ENV.ReleaseConnections, "on_close")
                .SetProperty(ENV.Dialect, typeof (SQLiteDialect).AssemblyQualifiedName)
                .SetProperty(ENV.ConnectionDriver, typeof (SQLite20Driver).AssemblyQualifiedName)
                .SetProperty(ENV.ConnectionString, "data source=:memory:")
                .SetProperty(ENV.ProxyFactoryFactoryClass, typeof (ProxyFactoryFactory).AssemblyQualifiedName)
                .SetProperty(ENV.CurrentSessionContextClass, typeof (ThreadStaticSessionContext).AssemblyQualifiedName);

            _persistenceModelGeneratorName = persistenceModelGenerator.Name;
            var persistenceModel = persistenceModelGenerator.Generate();
            var fluentCfg = Fluently.Configure(_config).Mappings(m => m.AutoMappings.Add(persistenceModel));
            SessionFactory = fluentCfg.BuildSessionFactory();
            Check.Require(SessionFactory.GetAllClassMetadata().Count > 0, "No mapped classes - check your AutoPersistenceModel!");

        }

        _session = SessionFactory.OpenSession();
        CurrentSessionContext.Bind(_session);

        new SchemaExport(_config).Execute(true, true, false, _session.Connection, Console.Out);
    }

    private bool _isSessionFactoryBuildRequired(IAutoPersistenceModelGenerator persistenceModelGenerator)
    {
        return
            _config == null
            || SessionFactory == null
            || !persistenceModelGenerator.Name.Equals(_persistenceModelGeneratorName);
    }

    public void Dispose()
    {
        _session.Dispose();
    }
}

}

Ответы [ 3 ]

5 голосов
/ 16 апреля 2010
  1. Конечно. Вы также можете использовать предыдущие версии, если настроили смешанный режим загрузки .
  2. Нет необходимости быть в GAC. Вы можете использовать gacutil для удаления сборок из GAC.
  3. Использование x64 DLL для Windows x64 и x86 для Windows x86
  4. Пожалуйста, опубликуйте полную трассировку стека исключений. Также, если вы используете сборку 3.5, используйте смешанный режим загрузки .
  5. FNH не имеет ссылки на SQLite.
1 голос
/ 05 мая 2010

Я хочу, чтобы это выделялось, чтобы это помогло кому-то еще; полная причина, по которой это происходит, объясняется здесь ; так что настройте ваш congig так, чтобы он использовал ОБА перенаправление там в комбинированном режиме смешанной загрузки, на который ссылается Маврикий.

0 голосов
/ 18 декабря 2010

У меня была такая же проблема, и я почти не нашел помощи на всех форумах и в блогах.

Обратите внимание, что эта проблема характерна для случая, в котором все соответствуют следующим критериям: - используя SQLite - с System.Data.SqlLite - на машине x64 - и NHibernate (2.1.2.4 в моем случае)

Этот кусок конфигурации в моем web.config (или app.config для моих модульных тестов) заставил его работать. Я должен был проверить сборку, чтобы убедиться, что он загружается правильно.

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <qualifyAssembly 
        partialName="System.Data.SQLite" 
        fullName="System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=AMD64" />
    </assemblyBinding>
  </runtime>
</configuration>

Где-то в своей внутренней структуре, во время отображения с использованием отсканированных сборок, NHibernate создает объект Assembly, используя его имя paritla, в виде строки "System.Data.SQLite". Каким-то образом загруженная версия сборки x86.

Приведенная выше конфигурация убедилась, что использование частичного имени для загрузки сборки предоставит версию x64.

РЕДАКТИРОВАТЬ: я использую версию 1.0.66.0 и взял DLL в папке bin \ x64 в файле SQLite-1.0.66.0-binaries.zip, доступном на sourceforge здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...