2016-08-09 13 views
1

Fluent NHibernateの遅延読み込みを無効にすることについて非常に多くの記事を読んでいますが、どれも動作していません。私はグローバルに遅延読み込みを無効にしたい。誰でも私にそのことを知らせることができますか?Fluent NHibernateで遅延ロードをグローバルに無効にする方法は?

流暢NHibernateの構成は、以下を参照してください:

_sessionFactory = Fluently.Configure() 
      .Database(MsSqlConfiguration.MsSql2008 
       .ConnectionString(_connectionString) 
       .ShowSql()) 
      .Mappings(m => m.FluentMappings.AddFromAssemblyOf<UserMap>() 
       .Conventions.Add(FluentNHibernate.Conventions.Helpers.DefaultLazy.Never())) 
      .BuildSessionFactory(); 

答えて

0

あなたが特定の外部キーのための遅延ロードを削除するためにグローバルIReferenceConventionを追加することができます。

public class FirstRecord { 
    public int Id { get; set; } 
    public int Name { get; set; } 
    // Disable lazy load 
    [Aggregate] 
    public SecondRecord SecondRecord { get; set; } 
    // Lazy load 
    public ThirdRecord ThirdRecord { get; set; } 
} 

public class SecondRecord { 
    public int Id { get; set; } 
    public int Name { get; set; } 
} 

public class ThirdRecord { 
    public int Id { get; set; } 
    public int Name { get; set; } 
} 

:などの集計属性

public class AggregateAttribute : Attribute { 
} 

public class ReferenceConvention : IReferenceConvention, IReferenceConventionAcceptance, IHasManyConvention, IHasManyConventionAcceptance { 
    public void Apply(IManyToOneInstance instance) { 
     instance.Fetch.Join(); 
    } 

    public void Accept(IAcceptanceCriteria<IManyToOneInspector> criteria) { 
     criteria.Expect(x => x.Property != null && x.Property.MemberInfo.GetCustomAttributes(typeof(AggregateAttribute), false).Any()); 
    } 

    public void Apply(IOneToManyCollectionInstance instance) { 
     instance.Fetch.Select(); 
    } 

    public void Accept(IAcceptanceCriteria<IOneToManyCollectionInspector> criteria) { 
     criteria.Expect(x => x.Member != null && x.Member.IsDefined(typeof(AggregateAttribute), false)); 
    } 
} 

使用このコードは、のプロパティの遅延読み込みを削除しますあなたがあることを、すべてのプロパティのために怠惰無効にし、この属性および更新大会のクラスを削除する場合、それに属性:このコードで

public class ReferenceConvention : IReferenceConvention, IHasManyConvention{ 
    public void Apply(IManyToOneInstance instance) { 
     instance.Fetch.Join(); 
    } 
    public void Apply(IOneToManyCollectionInstance instance) { 
     instance.Fetch.Select(); 
    } 
} 

、NHibernateの意志で関連レコードを結合することにより、1人の関係に多くの自動ロード同じクエリと、別のクエリで1対多のクエリを実行できます。それを使用するに

、シンプルな新しい条約を登録:

.Conventions.Add(new ReferenceConvention()) 
+0

あなたがそれを使用する方法をいくつかの例を示していただけますか? –

+0

使用方法に関する最新の回答をご覧ください。 – mdameer

+0

まだ遅延ロードが発生します。遅延読み込みを完全に無効にしたいしたがって、関連するプロパティはnullになります。 –

関連する問題