2

Fluent NHibernate 1.3.0.727 および NHibernate 3.3.0.4000 を使用して、プロパティをデータベースの列にマップします。以下は、ClassMap の 1 つの簡略化されたサンプルです。

    public class TankMap : ClassMap<Tank>
    {
        public TankMap()
        {
            Id(o => o.Id);
            Map(o => o.TankSystem);
        }
    }

この場合、TankSystem プロパティはstringです。

アプリケーションの一部には、マップされたプロパティ (TankSystem など) に何度もアクセスすることを伴う多くの計算があります。アプリケーションをプロファイリングするとき、これらのプロパティにアクセスするだけでもかなりの時間がかかります。これは、アクセスするたびに NHibernate.Proxy.DefaultLazyInitializer.Intercept メソッドを経由する必要があるためです。

計算をできるだけ高速にする必要があり、このプロキシのオーバーヘッドを回避したいと考えています。1 つのアプローチは、必要なプロパティ (TankSystem など) を配列にコピーし、この情報にアクセスしたいときにいつでも配列を使用することですが、これはあまりオブジェクト指向のアプローチではありません。

アップデート:

たとえば、次のように、Not.LazyLoad を使用してプロパティのマッピングを試みました。

Map(o => o.TankSystem).Not.LazyLoad();

ただし、これは、このプロパティが実際にプロキシされているかどうかには影響しないようです。

このプロキシのオーバーヘッドを回避/削減するオプションはありますか?

4

3 に答える 3

1

マッピングで .Not.LazyLoad() を使用し、必要に応じてクエリで積極的にロードすることに本当に注意します。遅延読み込みフェッチ戦略が正しく構成されていないと、問題が発生する可能性があります。NHProf などのツールを使用して、すべてのクエリを常にチェックすることをお勧めします。

リンク:

var tanks = _session.Linq<Tank>()
               .Fetch(x=>x.TankSystem)
               .ToList();

QueryOver (私の設定): var tanks = _session.QueryOver() .Fetch(x=>x.TankSystem).Eager .List();

TankSystem tankSystemAlias = null;
var tanks = _session.QueryOver<Tank>()
                .JoinAlias(x=>x.TankSystem, () => tankSystemAlias, JoinType.InnerJoin) // or JoinType.LeftOuterJoin
                .List()
于 2012-05-03T07:10:31.297 に答える
1

はい!.Not.LazyLoad()救助のために!

    public TankMap()
    {
        Id(o => o.Id);
        Map(o => o.TankSystem).Not.LazyLoad();
    }

私はそれについての良い短い説明を見つけました:

Not.LazyLoad() が何を意味するのか疑問に思うかもしれません。デフォルトでは、Fluent NHibernate は遅延ロードを使用するようにマッピングを定義します。しかし、これは、エンティティのすべてのプロパティが仮想 (プロキシ) でなければならないことも意味します。

ソース

于 2012-05-02T17:53:03.537 に答える
0

オブジェクトに仮想プロパティを持たないようにする 1 つの方法は次のとおりです。

public TankMap()
{
        Id(o => o.Id);
        this.Not.LazyLoad(); 
        Map(o => o.TankSystem);
}

この方法では、プロパティ プロキシ マジックはありません。

于 2012-05-02T17:54:33.233 に答える