【问题标题】:NHibernate Fluently Configure Default Flush Mode for Session / SessionFactoryNHibernate Fluently 为 Session / SessionFactory 配置默认刷新模式
【发布时间】:2018-09-10 15:09:38
【问题描述】:

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

根据这个 SO question 应该是可能的: 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());

因此,当我调试时,刷新模式是不同的:

【问题讨论】:

标签: c# .net nhibernate fluent-nhibernate


【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 2011-12-31
    相关资源
    最近更新 更多