1

Automapperに親子関係を正しくマップさせるための多くのオプションを試しました。Entity FrameworkでDynamicProxiesが生成されると、Automapperとマッピングの親子関係によってStackOverflowエラーが発生しますか?

モデル:

//Entity 
public class WorkArea 
{ 
    public Guid Id; 
    public Name {get;set;} 
    public Guid? ParentWorkAreaId {get;set;} //for entity Framework Foreign Key 
    public WorkArea ParentWorkArea {get;set;} 
    public ICollection<WorkArea> ChildWorkareas {get;set;} 
} 

//DTO 
public class WorkAreaDto 
{ 
    public Guid Id; 
    public Name {get;set;} 
    public Guid? ParentWorkAreaId {get;set;} //for entity Framework Foreign Key 
    public WorkAreaDto ParentWorkArea {get;set;} 
    public ICollection<WorkAreaDto> ChildWorkareas {get;set;} 
} 

このマッピングは、スタックオーバーフローが発生します。

Mapper.CreateMap<WorkArea,WorkAreaDto>(); 

私は正確にthisのようなものを試してみましたが、同じエラーに

を持っていた私は、カスタムのTypeConverterを作成したが、子供のための再帰的な方法を書く必要があるだけでなく、親も。ちょうど多くの仕事が正しくマップするためにこれを取得するように思えます。私が何か間違っているかどうかはわかりません。私は私の問題は、エンティティフレームワークによって生成System.Data.Entity.DynamicProxiesだと思う :私は2.0

アップデートを使用しています。

+0

私は上記のコードをテストし、CreateMap呼び出しを実行するときにStackOverflowExceptionがを受信しませんでした。あなたはそれが例外を見ている場所ですか? – PatrickSteele

+0

Mapper.CreateMap <>()を呼び出すとき、またはMapper.Map <>()を呼び出すときに例外が発生しますか? –

+0

@dtryon:Mapper.Map <> – DDiVita

答えて

1

これはおそらく、あなたのデータを検査する必要があり、私のために完璧に動作します:

 [TestMethod] 
     public void TestMethod1() 
     { 
      Mapper.CreateMap<WorkArea, WorkAreaDto>(); 

      var source = CreateSource(); 

      WorkAreaDto destination = new WorkAreaDto(); 
      Mapper.Map(source, destination); 

      Assert.AreEqual(destination.ChildWorkareas.Count, 3); 

     } 

     private WorkArea CreateSource() 
     { 
      var id = Guid.NewGuid(); 

      var result = new WorkArea(); 
      result.Id = id; 
      result.Name = "Name" + id.ToString(); 
      result.ParentWorkArea = CreateSourceParent(result); 
      result.ParentWorkAreaId = result.ParentWorkArea.Id; 
      result.ChildWorkareas = CreateSourceChildren(result); 

      return result; 
     } 

     private ICollection<WorkArea> CreateSourceChildren(WorkArea parent) 
     { 
      var result = new Collection<WorkArea> 
       { 
       new WorkArea() { Id = Guid.NewGuid(), Name = "Child1", ParentWorkArea = parent, ParentWorkAreaId = parent.Id }, 
       new WorkArea() { Id = Guid.NewGuid(), Name = "Child2", ParentWorkArea = parent, ParentWorkAreaId = parent.Id }, 
       new WorkArea() { Id = Guid.NewGuid(), Name = "Child3", ParentWorkArea = parent, ParentWorkAreaId = parent.Id } 
       }; 

      return result; 
     } 

     private WorkArea CreateSourceParent(WorkArea source) 
     { 
      var id = Guid.NewGuid(); 

      var result = new WorkArea(); 
      result.Id = id; 
      result.Name = "Name" + id.ToString(); 
      result.ChildWorkareas = new Collection<WorkArea> 
      { 
       source 
      }; 

      return result; 

     } 
+0

これは動作しますが、私は問題が親を持つ子をマップしようとしたときだと思います。したがって、EFで作業エリアを照会すると、作業エリアをIDで取得し、それが子供であると仮定します。それには親があり、その親は子供かもしれません。 – DDiVita

+0

上記のテストでは、親(子が設定されている)と3人の子供がいるWorkAreaが表示されています。 WorkAreaの親が別の親を持っているときに問題が発生したと思いますか? –

+0

私の問題は、EFによって生成されたDynamicProxiesのように見えます。あなたの例は素晴らしい仕事でした。 – DDiVita

関連する問題