这是我的类和映射覆盖,当我在Member上调用IsActive方法时,由于某种原因,nhibernate从数据库中获取MemberExtraFields。当我在列表上调用方法时,这会导致n + 1个问题。
我能解决这个问题吗,我有懒惰(NoProxy,Proxy,False)
public class Member
{
public virtual Guid Id { get; set; }
public virtual MemberExtraFields MemberExtraFields { get; set; }
public virtual bool Enabled { get; set; }
public virtual bool IsActive()
{
return Enabled;
}
}
public class MemberExtraFields
{
public virtual Guid Id { get; set; }
public virtual bool ExcludeFromCompetitions { get; set; }
public virtual Member Member { get; protected set; }
}
public class MemberMap : IAutoMappingOverride<Member>
{
public void Override(AutoMapping<Member> mapping)
{
mapping.Id(x => x.Id).GeneratedBy.GuidComb();
mapping.HasOne(x => x.MemberExtraFields)
.Cascade.All().LazyLoad(Laziness.NoProxy);
}
}
public class MemberExtraFieldsMap : IAutoMappingOverride<MemberExtraFields>
{
public void Override(AutoMapping<MemberExtraFields> mapping)
{
mapping.Id(x => x.Id).GeneratedBy.Foreign("Member");
mapping.HasOne(x => x.Member).Constrained().ForeignKey();
}
}
答案 0 :(得分:1)
使用References
代替HasOne
。 HasOne
紧密耦合。
请注意,您的IsActive()
方法返回Enabled
属性,该属性与您的数据库字段相关联,需要从那里加载。当NHibernate
执行查询以填充该属性时,它还会执行另一个查询来填充MemberExtraFields MemberExtraFields { get; set; }
属性。
参考接受的答案here。