如何在C#中将默认FlushMode更改为Commit?

时间:2015-06-09 06:55:22

标签: c# nhibernate fluent-nhibernate

所以......已经说过了:

如何在C#中将FlushMode更改为Commit

我的意思是,在Fluent中,NHibernate FlushMode默认设置为Auto。

所以......要将FluentMode设置为提交,我需要打开会话然后更改它:

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

这会有效但是......这意味着我每次打开会话时都需要调用包含FlushMode.Commit的方法。 为了实现sessionFactory,我有几个包装(意味着只设置一次,然后在打开新的上下文时自动使用它),这意味着我不能只在我想要的时候直接打开会话而不需要深入了解工厂类型等。

有没有办法将默认FlushMode 从自动更改为提交?有没有办法在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。

2 个答案:

答案 0 :(得分:4)

如何为ISession配置默认FlushMode。我这样做的方式,以及可以找到共同的方式,是进入 ISessionFactory.OpenSession() (IoC,MVC AOP过滤器,Web API委托)和分配FlushMode (manually)

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

检查这些:

属性ISession.FlushMode定义如下:

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

,这是默认的实施代码段:

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

在ISessionFactory.OpenSession()调用期间无论如何都 设置。

原创,而不是工作方法

不支持记录在案的 <hibernate-configuration> 设置default_flush_mode

因此,我们为 <hibernate-configuration> 提供了这些配置属性(默认/不流畅的配置设置)

<击> 3.5. Optional configuration properties

  
      
  • default_flush_mode - 默认FlushMode,默认为未指定,例如。      
        
    • Unspecified | Never | Commit | Auto | Always
    •   
  •   

并基于例如在这个Q&amp;答:

NHibernate config properties in Fluent NHibernate

我们可以做到:

Fluently.Configure()
    .Database(ConfigureDatabase())
    .Mappings(ConfigureMapping)
    .ExposeConfiguration(ModifyConfiguration)
    .BuildConfiguration();

...

private void ModifyConfiguration(Configuration configuration)
{
    configuration.Properties["default_flush_mode"] = "Commit";
}

答案 1 :(得分:2)

显然此版本feature将在4.1.0版中提供,并且最近添加到this签入,

根据文档配置如下

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