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

时间:2013-01-15 23:39:16

标签: nhibernate fluent-nhibernate

当我运行此代码时,List方法会导致Developer的刷新。我不希望这种情况发生。

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>();
}

如果我交换using内的行以便首先检索语言,那么开发人员不会被刷新。但除非有充分的理由,否则我不想记得这样做。

我是否需要更改映射?这就是现在的样子:

class DeveloperMap : ClassMap<Developer>
{
    public DeveloperMap()
    {
        Table("Developers");
        Id(x => x.Id).GeneratedBy.Identity();
        Map(x => x.FirstName);
        Map(x => x.LastName);
        References(x => x.FavoriteLanguage).Cascade.None();
        HasManyToMany(x => x.AssignedProjects)
            .Cascade.None()
            .Table("DevelopersProjects")
            .FetchType.Join();
    }
}

这也是Developer类,以防万一。

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; }
}

2 个答案:

答案 0 :(得分:2)

如果您不更改数据,则根本不应该有刷新,除非您有一个重影(不正确的映射强制进行不必要的更新)。我建议您验证(使用分析器,检查SQL日志等)正在刷新的内容。

要防止自动刷新,只需将session.FlushMode设置为Auto(默认值)或Always以外的任何其他值。在我看来,Commit是最实际的行为。

答案 1 :(得分:1)

我曾多次注意到在Transaction内包装只读操作往往会导致不良影响。正如迭戈所提到的,Flush可能是由不正确的映射引起的。

我知道可能存在一些性能问题,如here所述。但是,如果您只是阅读,则不需要using(Transaction)阻止。

尝试删除它,

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