我正在使用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
,但是,此刷新模式是未应用于会话
这就是我获得ISession
和ISessionFactory
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());
答案 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;