NHibernate свободно настроить режим сброса по умолчанию для Session / SessionFactory - PullRequest
0 голосов
/ 10 сентября 2018

Я использую FluentNHibernate и пытаюсь настроить Environment.DefaultFlushMode на FlushMode.Commit

В соответствии с этим вопросом SO это должно быть возможно: Как изменить FlushMode по умолчанию на Commit в C #?

Действительно, эта функция была добавлена ​​https://nhibernate.jira.com/browse/NH-3619

Вот как я это использую:

    public ISessionFactory BootstrapSessionFactory()
    {
        return Fluently.Configure()
            .ExposeConfiguration(cfg =>
                cfg.SetProperty(Environment.DefaultFlushMode, FlushMode.Commit.ToString()))
            .BuildSessionFactory();
    }

Согласно исходному коду FluentConfiguration

    public FluentConfiguration ExposeConfiguration(Action<Configuration> config)
    {
        if (config != null)
        {
            this.configAlterations.Add(config);
        }
        return this;
    }

    public Configuration BuildConfiguration()
    {
        try
        {
            MappingConfiguration mappingConfiguration = new MappingConfiguration(this.logger);
            foreach (Action<MappingConfiguration> mappingsBuilder in this.mappingsBuilders)
            {
                mappingsBuilder(mappingConfiguration);
            }
            mappingConfiguration.Apply(this.Configuration);
            if (this.cache.IsDirty)
            {
                this.Configuration.AddProperties(this.cache.Create());
            }
            foreach (Action<Configuration> configAlteration in this.configAlterations)
            {
                configAlteration(this.Configuration);
            }

Я вижу, что мои изменения конфигурации применяются при отладке

Однако, когда я на самом деле проверяю session.FlushMode на сессию, построенную с использованием этого sessionFactory, я получаю другие FlushMode, которые я не установил.

Чего мне не хватает? Что я делаю не так?

Большое спасибо!

PS: используются версии библиотек:

<PackageReference Include="FluentNHibernate" Version="2.1.2" />
<PackageReference Include="NHibernate" Version="5.1.3" />

Обновление: Углубившись немного глубже, я вижу, что код выше действительно правильно устанавливает SessionFactory.DefaultFlushMode, однако этот режим сброса не применяется к сеансу

Вот так я получаю ISession и ISessionFactory

    public static void Install(IServiceCollection serviceCollection)
    {
        serviceCollection.AddSingleton<PersistenceSetup>();
        // ISessionFactory
        serviceCollection.AddSingleton(provider => provider.GetService<PersistenceSetup>().BootstrapSessionFactory());
        // ISession
        serviceCollection.AddTransient(provider => provider.GetService<ISessionFactory>().OpenSession());

И, как результат, режимы сброса отличаются при отладке: enter image description here

1 Ответ

0 голосов
/ 12 сентября 2018

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

Я использую NHibernate 4.1.0.4000, хотя; Вы используете верхнюю версию. Я не думаю, что это связано с версией NHibernate. Я сомневаюсь, что это связано с проблемой совместимости между Fluent и NHibernate.

Это не имеет прямого отношения к вашей проблеме, но я использую конфигурацию NHibernate по коду вместо Fulent.

Configuration configuration = new Configuration();
configuration.SessionFactory().DefaultFlushMode(FlushMode.Commit);
sessionFactory = configuration.BuildSessionFactory();

Устанавливает режим сброса по умолчанию на тот, который я выбрал. Когда я создаю сессию с использованием этой фабрики сессий, как показано ниже -

ISession session = sessionFactory.OpenSession();

этот сеанс удерживает правильный (в данном случае "Commit") режим сброса.

Лучшее решение - перейти на собственную конфигурацию NHibernate по коду; это обойдет все проблемы совместимости. Ниже приведены пространства имен, если вы решите переключиться:

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