0

当我运行此代码时,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; }
}
4

2 回答 2

2

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

为了防止自动刷新,只需设置session.FlushModeAuto(默认)或Always. Commit在我看来,是最实际的行为。

于 2013-01-16T11:11:09.913 回答
1

我曾多次指出,将只读操作包装在 aTransaction中往往会导致不良影响。正如 Diego 提到的,这Flush可能是由不正确的映射引起的。

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

尝试删除它,因此,

using (var session = this.SessionFactory.OpenSession())
{
    developer = session.Get<Developer>(id);
    languages = session.CreateCriteria<Language>().List<Language>();
}
于 2013-01-16T15:51:08.957 回答