Проверка базы данных SQLite после генерации схемы nhibernate - PullRequest
0 голосов
/ 10 мая 2010

Какой самый простой и эффективный способ убедиться, что ваша база данных SQLite действительно существует после использования инструмента создания схем NHib?

Cheers,
Berryl

EDIT

Я надеюсь, что есть что-то связанное с ISession (например, свойство соединения), которое можно протестировать;иногда при выполнении серии тестов это выглядит как хороший сеанс (IsOpen & IsConnected имеют значение true), но база данных отсутствует (запрос на нее выдает ошибку типа «нет такой таблицы»).

EDIT -ЧТО Я ДЕЛАЮ СЕЙЧАС

Строка подключения и другие свойства cfg

public static Configuration GetSQLiteConfig()
    {
        return new Configuration()
            .SetProperty(ENV.Dialect, typeof (SQLiteDialect).AssemblyQualifiedName)
            .SetProperty(ENV.ConnectionDriver, typeof (SQLite20Driver).AssemblyQualifiedName)
            .SetProperty(ENV.ConnectionString, "Data Source=:memory:;Version=3;New=True;Pooling=True;Max Pool Size=1")
            .SetProperty(ENV.ProxyFactoryFactoryClass, typeof (ProxyFactoryFactory).AssemblyQualifiedName)
            .SetProperty(ENV.ReleaseConnections, "on_close")
            .SetProperty(ENV.CurrentSessionContextClass, typeof (ThreadStaticSessionContext).AssemblyQualifiedName);
    }

Как я проверяю БД сейчас, из-за отсутствия чего-то «лучшего» (это проверяет сопоставления)

        public static void VerifyAllMappings(ISessionFactory sessionFactory, ISession session)
    {
        Check.RequireNotNull<ISessionFactory>(sessionFactory);
        Check.Require(session.IsOpen && session.IsConnected);

        _verifyMappings(sessionFactory, session);
    }

    private static void _verifyMappings(ISessionFactory sessionFactory, ISession session) {
        try {
            foreach (var entry in sessionFactory.GetAllClassMetadata())
            {
                session.CreateCriteria(entry.Value.GetMappedClass(EntityMode.Poco))
                    .SetMaxResults(0).List();
            }
        }
        catch (Exception ex) {
            Console.WriteLine(ex);
            throw;
        }
    }

        public static void VerifyAllMappings(ISessionFactory sessionFactory, ISession session)
    {
        Check.Require(!sessionFactory.IsClosed);
        Check.Require(session.IsOpen && session.IsConnected);

        try {
            foreach (var entry in sessionFactory.GetAllClassMetadata())
            {
                session.CreateCriteria(entry.Value.GetMappedClass(EntityMode.Poco))
                    .SetMaxResults(0).List();
            }
        }
        catch (Exception ex) {
            Debug.WriteLine(ex);
            throw;
        }
    }

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

        public ISession Session
    {
        get
        {
            var session = (ISession)CallContext.GetData(_lookupSessionKey);
            try
            {
                if (session == null)
                {
                    _log.Debug("Opening new Session for this context.");

                    session = FactoryContext.Factory.OpenSession();

                    if(RunTypeBehaviorQualifier != RunType.Production)
                        SchemaManager.GenerateNewDb(FactoryContext.Cfg, session.Connection);
                    CallContext.SetData(_lookupSessionKey, session);
                }
            }
            catch (HibernateException ex)
            {
                throw new InfrastructureException(ex);
            }
            return session;
        }
    }

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

    [Test]
    public void Schema_CanGenerateNewDbWithSchemaApplied()
    {
        DbMappingTestHelpers.VerifyAllMappings(_dbContext.FactoryContext.Factory, _dbContext.Session);
    }

Ответы [ 2 ]

1 голос
/ 11 мая 2010

Berryl,

Насколько я вижу, вы боретесь с сопоставленными сущностями, потому что вы используете разные соединения. Есть ли какое-либо требование, которое обязывает вас использовать более одного «реального» соединения с БД? Я имею в виду, могут ли ваши тесты использовать один и тот же сеанс (логически)? Если нет, вы можете просто настроить вашу БД как:

      <property name="connection.connection_string">Data Source=NonTransactionalDB.txt;Version=3;New=True;Pooling=True;Max Pool Size=1;</property>

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

Важно помнить, однако, что он вводит вам некоторые ограничения в отношении транзакций. Поскольку SQLite не может обрабатывать более одной транзакции на соединение , параллельный запуск ваших тестов может вызвать проблемы (что-то вроде «файл базы данных заблокирован, исключение»).

Приветствия

Филип

0 голосов
/ 12 мая 2010

Берриль, просто чтобы было проще визуализировать, я выложу в качестве другого ответа. Не стесняйтесь дать мне еще один, если это поможет вам. :)

Ниже приведен код, который я использую для проверки правильности настройки объекта конфигурации NH.

        // assert: verify some properties just to see if connection properties were applyed ane entities mapped
        Assert.AreEqual<string>(cfg.Properties["connection.connection_string"], @"Server=localhost;Initial Catalog=MoveFrameworkDataNHibernate;User Id=sa;Password=sa");
        Assert.AreEqual<string>(cfg.Properties["dialect"], "NHibernate.Dialect.MsSql2000Dialect");
        Assert.IsNotNull(cfg.GetClassMapping(typeof(MappedEntity)));

С уважением, я тоже не уверен, что БД доступна для проверки объекта конфигурации, но это способ узнать: да, мои сущности есть, и я указываю на правильную БД.

Я понимаю, что вы боитесь использовать второе соединение SQLite, и БД была открыта в предыдущем, поэтому вы получите нежелательные исключения, но, насколько я вижу, единственная другая возможность проверить, являются ли ваши сущности там будет что-то вроде кода ниже. Однако, поскольку он ссылается на SessionFactory, он не помогает ничего, кроме предыдущего параметра.

        tx.Session.SessionFactory.GetClassMetadata(typeof(MappedEntity)) != null

Последний вариант, который я могу себе представить, в этом случае, это выполнить SQL напрямую к вашей БД с проверкой EXISTS. Я не знаю, насколько независима команда EXISTS между ВСЕМИ реализациями БД, но для простой проверки, как мы здесь говорим, это не должно быть большой проблемой.

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

Кстати: это jfneis. Neis это фамилия. Ничего общего с картошкой фри, картошкой фри или чем-то в этом роде. :)

Приветствие.

Филип

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