NHibernate / FluentNHibernate и SQLite в памяти для проверки соответствия - PullRequest
1 голос
/ 14 марта 2012

Я впервые пытаюсь использовать SQLite и NHibernate для проверки своих отображений, но я получаю эту ошибку:

Test method BMGChip.Tests.clsCorrespondenteMapTest.Can_correctly_map_Correspondente threw exception: 
NHibernate.Exceptions.GenericADOException: could not insert: [BMGChip.NHibernate.Entities.clsCorrespondente][SQL: INSERT INTO CPHSITE12_COR (COR_NOM, COR_EMA, COR_TEL, COR_RUA, COR_NUM, COR_COM, COR_CID, COR_EST, COR_CEP) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?); select last_insert_rowid()] ---> System.Data.SQLite.SQLiteException: SQLite error
no such table: CPHSITE12_COR

Я пытаюсь создать и удалить базу данных для каждого метода тестирования.

Моя конфигурация NHibernate:

Public Class clsSessionFactoryBuilder
    Private Shared _sessionFactory As ISessionFactory

    Private Shared Function GetSessionFactory() As ISessionFactory
        If _sessionFactory Is Nothing Then
            _sessionFactory = Fluently.Configure() _
                .Mappings(Function(m) m.FluentMappings.AddFromAssemblyOf(Of clsFaleConoscoMap)()) _
                .Database(SQLiteConfiguration.Standard.InMemory().ShowSql()) _
                .ExposeConfiguration(Function(cfg) ExportarSchema(cfg)) _
                .ExposeConfiguration(Function(cfg) cfg.SetProperty("current_session_context_class", "thread_static")) _
                .BuildSessionFactory()
        End If

        Return _sessionFactory
    End Function

    Public Shared Sub OpenSession()
        Dim session As ISession = GetSessionFactory.OpenSession
        CurrentSessionContext.Bind(session)
    End Sub

    Public Shared Function GetCurrentSession() As ISession
        Return GetSessionFactory.GetCurrentSession
    End Function

    Public Shared Sub CloseSession()
        Dim session As ISession = CurrentSessionContext.Unbind(_sessionFactory)

        If session Is Nothing Then Return

        Try
            'session.Transaction.Commit()
        Catch ex As Exception
            'session.Transaction.Rollback()
        Finally
            session.Close()
            session.Dispose()
        End Try
    End Sub

    Private Shared Function ExportarSchema(ByVal configuration As Cfg.Configuration)
        Dim export As New SchemaExport(configuration)

        export.Create(False, True)
        Return Nothing
    End Function
End Class

Мой тест:

<TestMethod()>
Public Sub Can_correctly_map_Correspondente()
    clsSessionFactoryBuilder.OpenSession()

    Dim session As ISession = clsSessionFactoryBuilder.GetCurrentSession()

    With New PersistenceSpecification(Of clsCorrespondente)(session)
        .CheckProperty(Function(c) c.Nome, "Fernanda Moreira")
        .CheckProperty(Function(c) c.Email, "fernanda@moreira.com.br")
        .CheckProperty(Function(c) c.Telefone, "(31) 3131-3131")
        .CheckProperty(Function(c) c.Rua, "R. Andaluzita")
        .CheckProperty(Function(c) c.Numero, "775")
        .CheckProperty(Function(c) c.Complemento, "Do lado do Pátio Savassi")
        .CheckProperty(Function(c) c.Cidade, "Belo Horizonte")
        .CheckProperty(Function(c) c.Estado, "MG")
        .CheckProperty(Function(c) c.Cep, "44444-444")
        .VerifyTheMappings()
    End With

    clsSessionFactoryBuilder.CloseSession()
End Sub

Что может быть?

Ответы [ 2 ]

1 голос
/ 16 марта 2012

Мне удалось заставить его работать. Я понял, что мне нужно построить свою схему после вызова BuildSessionFactory()

Public Class clsSessionFactoryBuilder
    Private Shared sessionFactory As ISessionFactory
    Private Shared configuration As Cfg.Configuration

    Public Shared Function GetSessionFactory() As ISessionFactory
        If sessionFactory Is Nothing Then
            sessionFactory = Fluently.Configure() _
                .Database(SQLiteConfiguration.Standard.InMemory) _
                .Mappings(Function(m) m.FluentMappings.AddFromAssemblyOf(Of clsFaleConoscoMap)()) _
                .ExposeConfiguration(Function(c) c.SetProperty("current_session_context_class", "call")) _
                .ExposeConfiguration(Function(c) c.SetProperty("connection.release_mode", "on_close")) _
                .ExposeConfiguration(Function(c) PersistConfig(c)) _
                .BuildSessionFactory()
        End If

        Return sessionFactory
    End Function

    Public Shared Function OpenSession() As ISession
        Dim session As ISession = GetSessionFactory.OpenSession
        CurrentSessionContext.Bind(session)

        SchemaExport(configuration)

        Return session
    End Function

    Public Shared Function GetCurrentSession() As ISession
        Return GetSessionFactory.GetCurrentSession
    End Function

    Public Shared Sub CloseSession()
        Dim session As ISession = CurrentSessionContext.Unbind(sessionFactory)

        If session Is Nothing Then Return

        session.Close()
        session.Dispose()
    End Sub

    Private Shared Function SchemaExport(ByVal configuration As Cfg.Configuration)
        Dim export As New SchemaExport(configuration)

        export.Execute(False, True, False, sessionFactory.GetCurrentSession.Connection, Nothing)
        Return Nothing
    End Function

    Private Shared Function PersistConfig(ByVal c As Cfg.Configuration)
        configuration = c
    End Function
End Class
1 голос
/ 14 марта 2012

Попробуйте позвонить SchemaExport.Execute после создания сеанса, чтобы он создал таблицы. Вот выдержка из моего кода модульного теста C #:

new SchemaExport(configuration).Execute(
            false, // Change to true to write DDL script to console
            true,
            false,
            this.Session.Connection,
            null);

Также помните, что конфигурация SQLIte в памяти не сохраняется между сеансами, поэтому вам нужно будет выполнить экспорт схемы для каждого теста (может быть, есть опция конфигурации, чтобы переопределить это, не уверен).

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