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

Ole*_*jko 2 c# nhibernate fluent-nhibernate

所以……已经说过了:

在 C# 中如何更改FlushModeCommit

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

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

var someSessionFactory = ... bla bla ..;
var session = someSessionFactory.OpenSession();
session.FlushMode = FlushMode.Commit;
Run Code Online (Sandbox Code Playgroud)

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

有没有办法将默认 FlushMode从 Auto更改为 Commit?有没有办法做到这一点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();
}
Run Code Online (Sandbox Code Playgroud)

我打电话是_sessionFActory.OpenSession()想看看 FlushMode 是否已经改变,然后……不。仍然 FlushMode 是自动,而不是提交。

Rad*_*ler 5

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

var session = SessionFactory.OpenSession();
session.FlushMode = FlushMode.Commit;
Run Code Online (Sandbox Code Playgroud)

检查这些:

属性 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; }
Run Code Online (Sandbox Code Playgroud)

这是默认的实现片段:

public sealed class SessionImpl : ...
{
    ...
    private FlushMode flushMode = FlushMode.Auto;
    ...
Run Code Online (Sandbox Code Playgroud)

不是该ISessionFactory.OpenSession()调用期间无论如何设置。

原始的,不工作的方法

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

因此,我们有这些配置属性可用于(默认/非流畅配置设置)<hibernate-configuration>

3.5. 可选配置属性

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

并基于例如这个问答:

Fluent NHibernate 中的 NHibernate 配置属性

我们可以做的:

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

...

private void ModifyConfiguration(Configuration configuration)
{
    configuration.Properties["default_flush_mode"] = "Commit";
}
Run Code Online (Sandbox Code Playgroud)