NHibernate 3.2: SchemaExport не работает с SQLite - PullRequest
2 голосов
/ 24 марта 2012

Я использую базу данных в памяти для некоторых быстрых модульных тестов, используя следующий код:

public class MemoryDb
{
    private static Configuration configuration;
    private static ISessionFactory sessionFactory;

    static MemoryDb()
    {
        configuration = new NHibernate.Cfg.Configuration();

        configuration.DataBaseIntegration(x =>
        {
            x.Driver<SQLite20Driver>();
            x.Dialect<SQLiteDialect>();
            x.ConnectionProvider<DriverConnectionProvider>();
            x.KeywordsAutoImport = Hbm2DDLKeyWords.AutoQuote;
            x.IsolationLevel = IsolationLevel.ReadCommitted;
            x.ConnectionString = "Data Source=:memory:;";
            x.Timeout = 255;
            x.BatchSize = 100;
            x.LogFormattedSql = true;
            x.LogSqlInConsole = true;
            x.AutoCommentSql = false;
        });

        configuration.AddMapping(DbHelper.GetAutoMappings());
        sessionFactory = configuration.BuildSessionFactory();
    }

    public static ISession GetSession()
    {
        var session = sessionFactory.OpenSession();
        new SchemaExport(configuration).Execute(true, true, false, session.Connection, null);
        return session;
    }
}

Проблема в том, что экспорт схемы, похоже, не работает.Один из моих тестов выглядит так:

[Fact]
public void ShouldFindDuplicateByEmail()
{
    using (var session = MemoryDb.GetSession())
    {
        var repo = new NHibernateCustomerRepository(session);
        var customer = new Customer();
        customer.EmailAddress = "test@test.com";
        repo.Save(customer);

        var duplicates = repo.FindDuplicates(customer);
        Assert.Equal(1, duplicates.Length);
    }
}

Тест не пройден с ошибкой no such table: Customers.Это все работало с Fluent NHibernate и NHibernate 3.1.Я знаю, что это не проблема самих сопоставлений, потому что само приложение работает, когда я запускаю его на существующей базе данных SQL Server.Сбой только при запуске тестов.Есть какие-нибудь мысли?

Редактировать: Если я изменяю только строку подключения так, чтобы она записывала в файл (т. Е. x.ConnectionString = "data source=" + Path.GetTempFileName();, все работает.БД в памяти, или он получает новую БД в памяти каждый раз, когда я выполняю команду сеанса, но понятия не имею, как это выяснить.

1 Ответ

2 голосов
/ 24 марта 2012

Я нашел ответ здесь: https://forum.hibernate.org/viewtopic.php?p=2397541#p2397541

Мне пришлось добавить следующее в конфигурацию БД:

x.ConnectionReleaseMode = ConnectionReleaseMode.OnClose;

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

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