当我运行此代码时,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; }
}
答案 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>();
}