Fluent Nhibernate 调用方法时一对一延迟加载
Fluent Nhibernate One-to-one lazy loading when invoking a method
这是我的 类 和映射覆盖,当我调用 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();
}
}
使用 References
而不是 HasOne
。 HasOne
是紧耦合。
请注意,您的 IsActive()
方法 returns Enabled
属性 与您的数据库字段相关联,需要从那里加载。当 NHibernate
执行查询以填充 属性 时,它还会执行另一个查询以填充 MemberExtraFields MemberExtraFields { get; set; }
属性.
参考已接受的答案 here。
这是我的 类 和映射覆盖,当我调用 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();
}
}
使用 References
而不是 HasOne
。 HasOne
是紧耦合。
请注意,您的 IsActive()
方法 returns Enabled
属性 与您的数据库字段相关联,需要从那里加载。当 NHibernate
执行查询以填充 属性 时,它还会执行另一个查询以填充 MemberExtraFields MemberExtraFields { get; set; }
属性.
参考已接受的答案 here。