2016-11-10 1 views
0

ここで私のクラスとマッピングのオーバーライドは、Memberに対してIsActiveメソッドを呼び出すと何らかの理由でnhibernateがデータベースからMemberExtraFieldsをフェッチします。これは、リストのメソッドを呼び出すと、n + 1の問題を引き起こしています。 Fluent Nhibernateメソッドを呼び出すときに1対1の遅延読み込み

が、私はこの問題を解決する可能性が何もあり、私は(偽NoProxyディレクティブ、プロキシ、)すべての怠惰

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

'.HasOne()'の代わりに 'References()'を試しましたか?私が覚えていれば、 '.HasOne()'参照は常にロードされます。 – Rabban

+0

@Rabbanは参照に変更しました –

答えて

0

利用Referencesの代わりHasOneを持っています。 HasOneはタイトカップリングです。

IsActive()メソッドはデータベースフィールドに関連付けられており、そこからロードする必要があるEnabledプロパティを返します。 NHibernateがそのプロパティを満たすためにクエリを実行すると、MemberExtraFields MemberExtraFields { get; set; }プロパティを満たす別のクエリも実行されます。

受け入れ可能な回答hereを参照してください。

+0

ありがとう、これは実際に働いた。私はそれを働かせるために受け入れられた答えを微調整しなければならなかった。 データベース側のMemberExtraFieldsテーブルのプライマリキーと外部キーが同じであるため、メンバを追加しようとしたときにnhibernateがメンバを追加する前にmemberextrafieldを追加しようとしていましたが、 "INSERTステートメントがFOREIGN KEY制約と競合しました"という問題。これを克服するためにメンバーのMemberExtraFields部分を保存しないようにマッピングを更新しました。 –