3

私は2つのクラスを持っています:

public class Reference
{
  public virtual string Id { get; set; }
  // ... 
  public virtual Stamp Stamp { get; set; }
}

public class Stamp
{
  public DateTime? Created { get; set; }
  public User CreatedBy { get; set; }
  public DateTime? LastUpdated { get; set; }
  public User LastUpdatedBy { get; set; }
}

Reference.Stamp は、次の流暢な nhibernate マッピングを使用して、コンポーネントとしてマップされます (「スタンプ」フィールドが参照テーブルに表示されるように)。

public class ReferenceMap : ClassMap<Reference>
{
  public ReferenceMap()
  {
    Id(e => e.Id);
    // ...
    Component(e => e.Stamp);
  }
}

public class StampMap : ComponentMap<Stamp>
{
  public StampMap()
  {
    Map(e => e.Created);
    References(e => e.CreatedBy);
    Map(e => e.LastUpdated);
    References(e => e.LastUpdatedBy);
  }
}

「参照」アイテムをリストするときに N+1 を回避するために、「CreatedBy」フィールドと「LastUpdatedBy」フィールドで熱心なフェッチを実行したいと考えています。

私はこれを試しました:

Reference[] references = session
  .Query<Reference>()
  .Fetch(r => r.Stamp.CreatedBy)
  .Fetch(r => r.Stamp.LastUpdatedBy)
  .ToArray();

このエラーの原因:

System.ArgumentException: フェッチ要求は、種類 o => o.Related の単純なメンバー アクセス式である必要があります。「r.Stamp.CreatedBy」は複雑すぎます。

フェッチを機能させる方法についてのアイデアはありますか?

4

1 に答える 1

4

これは LINQ プロバイダーの制限だと思います。

次のいずれかを実行できます。

  • 使用しないFetch(N+1 問題を解決するためのより良い代替手段があります。私はバッチ処理を好みます)
  • これらのプロパティを直接マッピングします。Component
  • LINQ の代わりに HQL を使用する

それでも、あなたの構成はサポートされるべきだと思います。https://nhibernate.jira.comで問題を開くことができます。

于 2012-09-20T02:09:30.917 に答える