Получение Fluent NHibernate для работы с SQLite

Я уверен, что есть что-то простое, чего я не делал, но я пытаюсь заставить Fluent NHibernate работать с Sqlite на моей машине.

Я использовал NuGet для бесплатного скачивания nhibernate и добавил следующую сущность и отображение:

public class Customer
{
    public virtual string CustomerCode { get; set; }
    public virtual string Name { get; set; }
}

public class CustomerMap : ClassMap<Customer>
{
    public CustomerMap ()
        {
        Id(x => x.CustomerCode);
        Map(x => x.Name);
        Table("tblCustomer");
        }
}

Затем, после начала бесплатного руководства, я добавил следующий код в проект Windows Command:

class Program
{
    static void Main(string[] args)
    {

        var sessionFactory = CreateSessionFactory();

        using (var session = sessionFactory.OpenSession())
        {
            using (var transaction = session.BeginTransaction())
            {

                var customer = new Customer { CustomerCode = "123", Name = "Bob" };
                session.SaveOrUpdate(customer);
                transaction.Commit();
            }
        }
    }

    private static ISessionFactory CreateSessionFactory()
    {
        return Fluently.Configure()
            .Database(
            SQLiteConfiguration.Standard
            .UsingFile("firstProject.db")
            )
            .Mappings(m =>
                        m.FluentMappings.AddFromAssemblyOf<Program>())
            .ExposeConfiguration(BuildSchema)
            .BuildSessionFactory();
    }

    private static void BuildSchema(Configuration config)
    {
        // delete the existing db on each run
        if (File.Exists("firstProject.db"))
            File.Delete("firstProject.db");

        // this NHibernate tool takes a configuration (with mapping info in)
        // and exports a database schema from it
        new SchemaExport(config)
          .Create(false, true);
    }
}

Наконец, я добавил dll Sqlite с помощью NuGet.. однако при попытке запустить программу я получаю следующую ошибку:

Верхнее исключение:

An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.

Следующее исключение:

Could not create the driver from NHibernate.Driver.SQLite20Driver, NHibernate, Version=3.1.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4.

Внутреннее большинство исключений:

Unable to find the requested .Net Framework Data Provider.  It may not be installed.

Это когда он пытается создать сеанс factory.

Может ли кто-нибудь помочь с этим? Я запускаю 32-битную машину?

Спасибо

Dave

Ответ 1

Вам нужны две вещи:

  • Ссылка System.Data.SQLite в вашем проекте.
  • Включить sqlite3.dll, но вы также можете добавить ссылку на sqlite3.dll, потому что это неуправляемая dll. Просто добавьте его как элемент в решение и установите для его копирования в выходной каталог.

Ответ 3

После первоначального исследования я подумал, что это связано с тем, что в то время моя сборка System.Data.SQLite не была загружена в память, поэтому я включил код для предварительной загрузки сборки system.Data.SQLite. Однако при запуске приложения возникла реальная ошибка:

Сборка смешанного режима построена по сравнению с версией "v2.0.50727" среды выполнения и не может быть загружена в среду выполнения 4.0 без дополнительной информации о конфигурации.

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

<?xml version="1.0"?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

с важным битом useLegacyV2RuntimeActivationPolicy = "true"

Ответ 4

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

http://thelongwayback.wordpress.com/2009/11/02/fluent-nhibernate-sqlite-problem-the-idbcommand-and-idbconnection-implementation-in-the-assembly-system-data-sqlite-could-not-be-found/

В принципе, вам придется использовать более старую версию SQLite (v1.0.60) отсюда: http://sourceforge.net/projects/sqlite-dotnet2/files/

В другой заметке я получил тот же код, который работал вчера на машине с VS2010 SP1. Тот же код не будет работать сегодня на машине без SP1. Если кто-то получит шанс протестировать этот, то есть, установив VS2010 SP1, дайте мне знать результат, пожалуйста.

Ответ 5

Ни одно из вышеперечисленных решений, или любое другое, что я мог найти в Интернете, не работало для меня... до тех пор, пока...

Мне пришлось установить как x64, так и x86 версии SQLite (по ссылке Vadim: http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki), в частности заказ.

Первоначально я установил 32-разрядную версию перед 64-разрядной версией, которая ничего не исправить. По прихоти я удалил их обоих и переустановил их в обратном порядке. Теперь он работает!

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

Ответ 6

Я также столкнулся с этой проблемой.
Заметил, что проект образца стартера нацелен на .net framework 3.5, а тот, который я создал (проект упражнений), нацелен на профиль клиента .net framework 4.0 (по умолчанию vs2010).
Я изменил целевую версию на 3.5, и я смог работать над моим проектом упражнений.

Ответ 7

В моем случае это помогло установить System.Data.SqLite через NuGet.

Поэтому я открыл "Инструменты/Диспетчер пакетов NuGet/Консоль диспетчера пакетов" и набрал:

Install-Package System.Data.SqLite