NHibernate流畅地为Session / SessionFactory配置默认刷新模式

时间:2018-09-10 15:09:39

标签: c# .net nhibernate fluent-nhibernate

我正在使用FluentNHibernate并尝试将Environment.DefaultFlushMode配置为FlushMode.Commit

根据这个SO问题,应该是可能的: How to change default FlushMode to Commit in 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,但是,此刷新模式是未应用于会话

这就是我获得ISessionISessionFactory

的方式
    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 :(得分:1)

我不明白为什么您的代码不起作用。只要成功建立了会话工厂并从中创建会话,它就可以正常工作。

虽然我正在使用NHibernate 4.1.0.4000;您正在使用较高版本。我不认为这是由于NHibernate版本造成的。我怀疑这是由于Fluent和NHibernate之间的兼容性问题造成的。

这与您的问题没有直接关系,但我使用的是NHibernate Configuration by Code而不是Fulent。

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

这会将默认冲洗模式设置为我选择的冲洗模式。当我使用如下所示的会话工厂创建会话时-

ISession session = sessionFactory.OpenSession();

此会话保持正确的刷新模式(在这种情况下为“提交”)。

更好的解决方案是通过代码切换到NHibernate自己的配置。这将绕过所有兼容性问题。如果您决定切换以下名称空间:

using NHibernate.Cfg;
using NHibernate.Cfg.MappingSchema;