如何防止NHibernate在只读取数据的会话期间调用Flush

如何防止NHibernate在只读取数据的会话期间调用Flush,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,当我运行这段代码时,List方法会导致开发人员刷新。我不想发生这种事 Developer developer = null; IEnumerable<Language> languages = null; using (var session = this.SessionFactory.OpenSession()) using (var trx = session.BeginTransaction()) { developer = session.Get<Develop

当我运行这段代码时,List方法会导致开发人员刷新。我不想发生这种事

Developer developer = null;
IEnumerable<Language> languages = null;
using (var session = this.SessionFactory.OpenSession())
using (var trx = session.BeginTransaction())
{
    developer = session.Get<Developer>(id);
    languages = session.CreateCriteria<Language>().List<Language>();
}
这里还有开发人员类,以防万一会有所帮助

public class Developer
{
    public virtual int? Id { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual Language FavoriteLanguage { get; set; }
    public virtual IList<Project> AssignedProjects { get; protected internal set; }
}
公共类开发人员
{
公共虚拟int?Id{get;set;}
公共虚拟字符串FirstName{get;set;}
公共虚拟字符串LastName{get;set;}
公共虚拟语言FavoriteLanguage{get;set;}
公共虚拟IList AssignedProjects{get;受保护的内部集合;}
}

如果您不更改数据,则不应进行刷新,除非您有重影(不正确的映射导致不必要的更新)。我建议您(使用探查器、检查SQL日志等)确切地验证正在刷新的内容


要防止自动刷新,只需将
session.FlushMode
设置为除
Auto
(默认设置)或
始终
之外的任何设置<代码>提交在我看来是最实际的行为。

如果您不更改数据,就不应该有刷新,除非您有一个重影(不正确的映射导致不必要的更新)。我建议您(使用探查器、检查SQL日志等)确切地验证正在刷新的内容


要防止自动刷新,只需将
session.FlushMode
设置为除
Auto
(默认设置)或
始终
之外的任何设置<代码>提交在我看来是最实际的行为。

我已经注意到,在
事务
中包装只读操作往往会产生不希望的效果。正如迭戈提到的,
刷新可能是由不正确的映射引起的

如前所述,我理解这可能会有一些性能问题。但是,如果您只是在阅读,则不需要使用(事务)

试着移除它,就像这样

using (var session = this.SessionFactory.OpenSession())
{
    developer = session.Get<Developer>(id);
    languages = session.CreateCriteria<Language>().List<Language>();
}
使用(var session=this.SessionFactory.OpenSession())
{
developer=session.Get(id);
语言=session.CreateCriteria().List();
}

我已经注意到,在
事务中包装只读操作往往会导致不期望的效果。正如迭戈提到的,
刷新可能是由不正确的映射引起的

如前所述,我理解这可能会有一些性能问题。但是,如果您只是在阅读,则不需要使用(事务)

试着移除它,就像这样

using (var session = this.SessionFactory.OpenSession())
{
    developer = session.Get<Developer>(id);
    languages = session.CreateCriteria<Language>().List<Language>();
}
使用(var session=this.SessionFactory.OpenSession())
{
developer=session.Get(id);
语言=session.CreateCriteria().List();
}

即使在@event.Entity引用开发人员对象的情况下引发FlushEntity事件,flush似乎没有执行任何DB命令。SQL事件探查器仅显示预期的选择,不显示更新。这是否意味着我的映射是正确的。。。我看到Flush是“从Find()或Enumerable()的一些调用中”调用的。显然,这是其中的一个调用。。。将FlushMode设置为Commit可防止FlushEntity触发,这回答了我的问题,但我确实想知道是否有错误的映射。使用任何FlushMode都可以。这只是NH在做它的事情。尽管正在引发FlushEntity事件,其中@event.Entity引用了开发者对象,但flush似乎没有执行任何DB命令。SQL事件探查器仅显示预期的选择,不显示更新。这是否意味着我的映射是正确的。。。我看到Flush是“从Find()或Enumerable()的一些调用中”调用的。显然,这是其中的一个调用。。。将FlushMode设置为Commit可防止FlushEntity触发,这回答了我的问题,但我确实想知道是否有错误的映射。使用任何FlushMode都可以。这只是NH在做它的事情。这确实阻止了潮水的发生。我想这对我来说是可行的,只要我不需要使用二级缓存。@Andrew True。这完全取决于您需要多少信息,以及操作有多复杂。这确实可以防止刷新的发生。我想这对我来说是可行的,只要我不需要使用二级缓存。@Andrew True。这完全取决于您需要多少信息,以及操作的复杂性。