Domanda

Di recente mi sono spostato dall'uso di un ISession direttamente a un modello di tipo da unità di lavoro avvolto.

Lo testevo usando SQL Lite (in memoria). Ho una semplice classe helper che configura la mia sessionFactory, ho creato un'ession e quindi ho creato lo schema usando SchemaExport e poi ho restituito la mia iSession e lo schema è vissuto fino a quando non ho chiuso la sessione. L'ho cambiato leggermente in modo da configurare un Factory Session, creare un ISession, costruire lo schema e passare la fabbrica al mio NHIBERNATEUNITOFWORK e riportarlo al mio test.

var databaseConfiguration =
                SQLiteConfiguration.Standard.InMemory()
                .Raw("connection.release_mode", "on_close")
                .Raw("hibernate.generate_statistics", "true");

            var config = Fluently.Configure().Database(databaseConfiguration).Mappings(
                m =>
                {
                    foreach (var assembly in assemblies)
                    {
                        m.FluentMappings.AddFromAssembly(assembly);
                        m.HbmMappings.AddFromAssembly(assembly);
                    }
                });

            Configuration localConfig = null;
            config.ExposeConfiguration(x =>
                {
                    x.SetProperty("current_session_context_class", "thread_static"); // typeof(UnitTestCurrentSessionContext).FullName);
                    localConfig = x;
                });

            var factory = config.BuildSessionFactory();
            ISession session = null;

            if (openSessionFunction != null)
            {
                session = openSessionFunction(factory);
            }

            new SchemaExport(localConfig).Execute(false, true, false, session.Connection, null);

            UnitTestCurrentSessionContext.SetSession(session);

            var unitOfWork = new NHibernateUnitOfWork(factory, new NHibernateUTCDateTimeInterceptor());
            return unitOfWork;

Internamente, NhibernateUnitofwork deve ottenere l'Imeession che è stata utilizzata per creare lo schema o il database in memoria non avrà effettivamente uno schema, quindi questo è il metodo che chiama per ottenere l'Isessione.

private ISession GetCurrentOrNewSession()
        {
            if (this.currentSession != null)
            {
                return this.currentSession;
            }

            lock (this)
            {
                if (this.currentSession == null)
                {
                    // get an existing session if there is one, otherwise create one
                    ISession session;
                    try
                    {
                        session = this.sessionFactory.GetCurrentSession();
                    }
                    catch (Exception ex)
                    {
                        Debug.Write(ex.Message);
                        session = this.sessionFactory.OpenSession(this.dateTimeInterceptor);
                    }

                    this.currentSession = session;
                    this.currentSession.FlushMode = FlushMode.Never;
                }
            }

Il problema è che this.sessionFactory.GetCurrentSession lancia sempre un'eccezione dicendo che il ICurrentSessionContext non è registrato.

Ho provato un sacco di modi diversi per impostare la proprietà e valori diversi (come puoi vedere sopra, "thread_static" e il mio ICurrentSessionContext) ma nessuno sembra funzionare.

Qualcuno ha ricevuto qualche consiglio

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top