2011-12-06 11 views
2

フォーク、 私は自分のサービスレイヤーでautomapperを使って簡単なPocosにEFオブジェクトをマッピングしています。私はEFに多くの関係を持つ特定のエンティティを持っていますが、どれくらいのものがDBから取り戻されるかを制限したいと思います。これらのエンティティの1つはデータベーステーブルにマップされますが、生成されたモデル(EDMX)にエンティティコレクションとして表示される他のテーブルとの関係が多くなります。EFエンティティタイプを自動マッピングしている間に遅延ロードを制限する

私は、エンティティの最初のレベルのプロパティ、つまり関連付けられたコレクション/エンティティコレクションではなく、いくつかの整数IDのpocoプロパティのみを持つエンティティの「浅い」ポコを作成しました。私はここでしか簡単なPOCOにエンティティをマッピングしていますので、私は、私はEFがしようとすると他の非参照データを照会しないことを確信することができ、...

var simplepocoforentity= Mapper.Map(_readOnlyDb.Single<EfEntity>(x => x.Id== Id), 
            new SimplPocoForEntity()); 

私の質問です....次のようにマップします私はマッピングを行うときに基礎となるdbテーブルの関係から?

私はこれをSQLプロファイリングで調べることができると知っていますが、そのルートを下っていくためには何らかの入力をお願いします。 ありがとう K.

答えて

2

AutoMapperの内部実装によって異なります。私は、AutoMapperがエンティティのナビゲーションプロパティにアクセスしようとしないと仮定します(この場合、遅延読み込みと追加のデータベースクエリが実行されます)。スカラーのプロパティのみをマップする場合、AutoMapperがこれを行うべき理由はありません。サイドノートとして

try 
{ 
    _readOnlyDb.ContextOptions.LazyLoadingEnabled = false; 

    var simplepocoforentity = Mapper.Map(_readOnlyDb.Entities 
     .Single(x => x.Id == Id), new SimplPocoForEntity()); 

    // ... 
} 
finally 
{ 
    _readOnlyDb.ContextOptions.LazyLoadingEnabled = true; 
} 

を:あなたが持つコンテキストに完全なエンティティをロードすることに注意してくださいしかし、誰が、あなたが安全側になりたい場合は、一時的に遅延読み込みを無効にすることができ...

を知っていますこのアプローチ。その後、マッピングが行われます。潜在的に必要以上に多くの列をデータベースからロードする可能性があります。

var simplepocoforentity = _readOnlyDb.Entities 
    .Where(e => e.Id == Id) 
    .Select(e => new SimplPocoForEntity 
    { 
     PocoProperty1 = e.EntityProperty1, 
     PocoProperty2 = e.EntityProperty2, 
     PocoProperty3 = e.EntityProperty3 
     // etc. 
    }) 
    .Single(); 
このアプローチで

あなたはエンティティをロードしていないので、何の遅延ロードが全く起こらないだろうが、直接:一般的に、私は、データベースのみを必要とされている列を照会することが保証投影してマッピングを行うだろうデータベースからのPocoForEntity

関連する問題