Intereting Posts

Как изменить флаг FlushMode по умолчанию на C #?

Итак … уже сказал это:

Как изменить FlushMode для FlushMode на C #?

Я имею в виду, что в Fluent NHibernate FlushMode по умолчанию устанавливается как «Авто».

Итак … чтобы установить FluentMode в Commit , мне нужно открыть сеанс, а затем изменить его:

 var someSessionFactory = ... bla bla ..; var session = someSessionFactory.OpenSession(); session.FlushMode = FlushMode.Commit; 

Это будет работать, но … это будет означать, что мне нужно вызвать метод, который содержит FlushMode.Commit каждый раз, когда я открываю сессию. Для inicialize sessionFactory у меня есть несколько оберток (предназначенные для его установки только один раз, а затем автоматически использовать его при открытии нового контекста), что означает, что я не могу просто открывать сеанс напрямую каждый раз, когда хочу, не копая в заводских условиях и т. Д.

Есть ли способ изменить по умолчанию FlushMode с Auto на Commit? Есть ли способ сделать это в var sessionFactory = Fluently.Configure(). ... var sessionFactory = Fluently.Configure(). ... ?

РЕДАКТИРОВАТЬ:

Пробовал заниматься сексом

 public void Initialise(params Assembly[] mappingAssemblies) { this._sessionFactory = Fluently.Configure() .Database( MsSqlConfiguration.MsSql2008 .ConnectionString(this._connectionString) .AdoNetBatchSize(10) .QuerySubstitutions("true 1, false 0, yes 'Y', no 'N'")) .Cache(c => c.Not.UseSecondLevelCache().Not.UseQueryCache()) .Mappings(m => { foreach (Assembly asm in mappingAssemblies) { m.FluentMappings.AddFromAssembly(asm); m.HbmMappings.AddFromAssembly(asm); } }) .ExposeConfiguration(ModifyConfiguration) .BuildSessionFactory(); var session = _sessionFactory.OpenSession(); } public void ModifyConfiguration(NHibernate.Cfg.Configuration configuration) { configuration.Properties["default_flush_mode"] = FlushMode.Commit.ToString(); } 

Я вызвал _sessionFActory.OpenSession() чтобы увидеть, изменился ли FlushMode и … Нет. Тем не менее FlushMode – это Auto, а не Commit.

Невозможно настроить по умолчанию FlushMode для ISession. То, как я это делаю, и способ, который может быть найден общим, – это шаг в ISessionFactory.OpenSession() (IoC, MVC AOP Filter, веб-API-делегат) и назначить FlushMode (manually)

 var session = SessionFactory.OpenSession(); session.FlushMode = FlushMode.Commit; 

Проверьте их:

  • Еще один способ управления вашей NHibernate ISessionFactory
  • NHibernate и блок работы

Свойство ISession.FlushMode, как определено ниже:

 public interface ISession : IDisposable { ... ///  /// Determines at which points Hibernate automatically flushes the session. /// ///  /// ///  /// For a readonly session, it is reasonable to set the flush mode /// to FlushMode.Never /// at the start of the session (in order to achieve some /// extra performance). /// ///  FlushMode FlushMode { get; set; } 

и это fragment реализации по умолчанию:

 public sealed class SessionImpl : ... { ... private FlushMode flushMode = FlushMode.Auto; ... 

не устанавливается так или иначе во время вызова ISessionFactory.OpenSession ().

ОРИГИНАЛЬНЫЙ, не рабочий подход

Документированный параметр default_flush_mode не поддерживается.

Итак, у нас есть эти свойства конфигурации, доступные для (по умолчанию / без плавной настройки конфигурации) :

3.5. Дополнительные свойства конфигурации

  • default_flush_mode – По умолчанию FlushMode , по умолчанию используется Unspecified.
    • Unspecified | Never | Commit | Auto | Always

и основаны, например, на этом Q & A:

Свойства конфигурации NHibernate в Fluent NHibernate

мы можем:

 Fluently.Configure() .Database(ConfigureDatabase()) .Mappings(ConfigureMapping) .ExposeConfiguration(ModifyConfiguration) .BuildConfiguration(); ... private void ModifyConfiguration(Configuration configuration) { configuration.Properties["default_flush_mode"] = "Commit"; } 

Очевидно, эта функция будет доступна в версии 4.1.0 и недавно добавлена ​​в эту процедуру ,

согласно документации, она конфигурируется следующим образом

 var cfg = new Configuration().Configure(); cfg.SessionFactory().DefaultFlushMode(FlushMode.Always);