2017-04-06 209 views
3

我收到automapper v6.0.2的问题,其中automapper试图将ICollection推入int而不是指定的集合。AutoMapper未映射子属性

错误:

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 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))); 

相关:

 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 config来

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