2011-12-03 33 views
4

私はこの問題で苦労しています:AutomapperとNHibernateの遅延読み込み

"Project"というNHibernateオブジェクトのリストがあります。これらのオブジェクトには、遅延のある "Branches"リストが含まれています。私はプロジェクトのリストをWCFサービスに渡そうとしているので、AutoMapperを使用してフラットオブジェクトに変換しています。

"ProjectContract"という名前のデスティネーションオブジェクトにブランチのリストが含まれていなくても、Automapperはこのコレクションを引き続き呼び出すため、NHibernateがレイジーロードを起動し、各プロジェクトのブランチコレクション。ここで

は、クラスとマッピングされている:

public class Project 
    { 
    public virtual int ID 
    { 
     get; 
     set; 
    } 

    public virtual string Name { get; set; } 
    public virtual string Description { get; set; } 

    public virtual IList<Branch> Branches { get; set; } 
    } 

    [DataContract] 
    public class ProjectContract 
    { 
    [DataMember] 
    public virtual int ID 
    { 
     get; 
     set; 
    } 

    [DataMember] 
    public virtual string Name { get; set; } 

    [DataMember] 
    public virtual string Description { get; set; } 
    } 

    public class ProjectMappings : Profile 
    { 
    protected override void Configure() 
    { 
     Mapper.CreateMap<Project, ProjectContract>(); 
    } 
    } 

私の質問は:私はそれを気にしないので、「支店」コレクションには触れないようにAutoMapperを伝える方法はありますし、それがあります多くのデータベース呼び出しをトリガーするプロキシ?

私はこれをMaxDepth(0)で一時的に修正しましたが、転送したいコレクションと、このような私が触れたくないコレクションがある他のエンティティがあります。その場合、MaxDepth(0)は機能しません。

は、 はCosmin

答えて

2

をありがとうはい、AutoMapperは機能を無視します。

Mapper.CreateMap<Source, Destination>() 
    .ForMember(dest => dest.SomeValuefff, opt => opt.Ignore()); 
+0

このプロパティは、プロパティが宛先にも存在する場合にのみ機能します。いずれにしても、目的地に「支店」を置き、無視オプションを使用しても、コレクションには引き続きアクセスされ、読み込みがトリガーされます。 「ソース」メンバーを無視する同様の機能がある場合は、私は興味があります。 – noir

+2

@noir、 "ここで何もする必要はありませんが、AutoMapperは目的地のメンバーだけを気にします。目的地のタイプで見つかったものをマップしようとします。から取らhttp://automapper.codeplex.com/workitem/4031 – gdoron

+0

それは私が同様に目的地にされていないそのコレクションで気にしないと思ったものでした。しかし、私はこの簡単なテストをプロジェクトのリストを取得し、プロジェクトの契約リストにマッピングしました。私はNhProfを使用しました。最初にプロジェクトを読み込むクエリがあり、各プロジェクトに対して分岐を読み込むクエリがあります。私がスタックトレースを見ると、AutoMapper.Internal.PropertyGetter.GetValueを指しているので、私は何か見ていないか、これがバグだと思っています。 – noir

関連する問題