2017-04-06 8 views
3

automapperがICollectionを指定されたコレクションではなくintに移動しようとしているautomapper v6.0.2で問題が発生しました。AutoMapperがサブプロパティーをマッピングしていません

エラー:

public Member() 
{ 
    this.Dependents = new HashSet<Dependent>(); 
} 
public virtual ICollection<Dependent> Dependents { get; set; } 

AutoMapperコンフィグ

CreateMap<Dependent, DependentDetailDto>(); 
CreateMap<Member, MemberDetailDto>() 
       .ForMember(a => a.Dependents, o => o.MapFrom(x => Mapper.Map<ICollection<Dependent>, ICollection<DependentDetail>>(x.Dependents))); 

依存

Mapping types: 
Member_B3B146AB4F61AEDE3DF3639BDBD65BFA5BCA0FC414F11960DC39DA834F2A8CBD -> ICollection`1 
System.Data.Entity.DynamicProxies.Memberr_B3B146AB4F61AEDE3DF3639BDBD65BFA5BCA0FC414F11960DC39DA834F2A8CBD -> System.Collections.Generic.ICollection`1[[MemberService.Dto.DependentDetailDto, MemberService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] 

Destination path: 
MemberDetailDto.Dependents.Dependents 

Source value: 
System.Data.Entity.DynamicProxies.MbmRosterSubscriber_B3B146AB4F61AEDE3DF3639BDBD65BFA5BCA0FC414F11960DC39DA834F2A8CBD ---> System.OverflowException: Value was either too large or too small for an Int32. 

メンバー:

 public string Title { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string MiddleName { get; set; } 
     public System.DateTime Dob { get; set; } 
     public string Sex { get; set; } 
     public string Relationship { get; set; } 
     public string CreatedBy { get; set; } 
     public string ModifiedBy { get; set; } 
     public string DepartmentCode { get; set; } 
     public string Address1 { get; set; } 
     public string Address2 { get; set; } 
     public string Address3 { get; set; } 
     public string City { get; set; } 
     public string State { get; set; } 
     public string MailCountry { get; set; } 
     public string Zip { get; set; } 
     public Nullable<System.DateTime> SsnEncryptDate { get; set; } 

扶養が除去された加入者は、完全にDependentエンティティについては

Model彼らはコピーされ、すべての項目publicとペーストをマッピングします。 AutoMapperが指定されたマップではなく、intにコレクションを圧縮しようとしているように見えます。

すべてのアイデア? これは、非同期方式における機能試験で試験された:

Dependentsナビゲーションプロパティ

編集です。テストが作成されている クイック単位:今すぐ返される

[TestMethod] 
public void RetrieveActiveMember() 
{ 
    MemberEntity.Member Subscriber = new Member(); 
    ICollection<Dependent> Dependent = new List<Dependent>(); 
    Dependent.Add(new Dependent { HostCountry = "HOME" }); 
    Subscriber.Dependents = Dependent; 

    var Mapped = AutoMapper.Mapper.Map<Member, MemberDetailDto>(Subscriber); 

    Assert.IsNotNull(Mapped); 
} 

エラーはタイプXのメソッド「追加」である実装を持っていない」

Property: 
Dependents ---> System.TypeLoadException: Method 'Add' in type 'Proxy<System.Collections.Generic.ICollection`1[[MemberService.Dto.DependentDetailDto_MemberService_Version=1.0.0.0_Culture=neutral_PublicKeyToken=null]]_mscorlib_Version=4.0.0.0_Culture=neutral_PublicKeyToken=b77a5c561934e089>' from assembly 'AutoMapper.Proxies, Version=0.0.0.0, Culture=neutral, PublicKeyToken=be96cd2c38ef1005' does not have an implementation. 

に依存ためautomapperの設定を変更します
CreateMap<ICollection<Dependent>, ICollection<DependentDetailDto>>() 
       .ConstructUsing((ICollection<Dependent> Dependents) => { 
        List<DependentDetailDto> DependentList = new List<DependentDetailDto>(); 
        foreach (var Dependent in Dependents) 
         DependentList.Add(new DependentDetailDto { }); 
       return DependentList; 
      }); 

実際には大きな注意書きであるAutomapperを使用していなくてもユニットテストが機能しますが、それでも機能テストは中断します

扶養が偶数フィールドに

補遺持っていないように私は追加するには何かを考えることはできません:エンティティ、DTO、呼び出し元が異なるライブラリー内のすべてのですが、私はすることができていないがそれを.NETFiddleで複製してください。

+0

'Dependent'と' DependentDetail'クラスの定義を追加するのを忘れました。 –

+0

追加されました。クラス名の宣言を除いて何も残してコピー&ペーストしません。 – SCFi

+0

まだ問題を再現できません。問題を再現する[最小、完全、かつ検証可能な例の作成方法](http://stackoverflow.com/help/mcve)に気を配りますか? –

答えて

0

は、問題の根本的な原因を把握が、修正が見つかりませんでした。

MemberDtoプロパティDependentsの名前をDependentssに変更しました。それを元に戻すと、再びそれが壊れます。私はいずれかのオブジェクトに他のDependentsプロパティがないことを追加する必要があります。

名前はわかりませんが、名前が壊れているように見えます。

2

Automapperは通常あなたのためにコレクションを処理する必要があります。また、適用可能な既知の地図を検索するので、MapFromの中にMapper.Mapを呼び出す必要はありません。

ただ、個々のエンティティのためのマップを定義します。

CreateMap<Dependent, DependentDetailDto>(); 
CreateMap<Member, MemberDetailDto>() 
    .ForMember(dto => dto.Dependents, o => o.MapFrom(src => src.Dependents); 
+0

これは知っておきますが、これで問題は解決しませんでした。 – SCFi

+0

これは私にとってはうまくいくものですが、コレクションを 'List 'で初期化しています。 'this.Dependents = new HashSet ();'を変更し、これが機能するかどうか確認してください。 –

+0

いいえ、それはDLLの問題かもしれませんので、私はもっとそれに触れて、参照や名前空間をやり直さなければなりません。 – SCFi

関連する問題