Fluent Nhibernate调用方法

时间:2016-11-10 04:15:50

标签: c# nhibernate fluent-nhibernate lazy-loading one-to-one

这是我的类和映射覆盖,当我在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();
    }
}

1 个答案:

答案 0 :(得分:1)

使用References代替HasOneHasOne紧密耦合。

请注意,您的IsActive()方法返回Enabled属性,该属性与您的数据库字段相关联,需要从那里加载。当NHibernate执行查询以填充该属性时,它还会执行另一个查询来填充MemberExtraFields MemberExtraFields { get; set; }属性。

参考接受的答案here