2017-04-03 196 views
1

这里是我的ViewModels和datamodelsautomapper错误映射类型集合

public class League{ 
    ICollection<Player> Players{get;set;} 
} 

public class Player{ 
    string name{get;set;} 
} 

public class LeagueViewModel{ 
    ICollection<PlayerViewModel> Players{get;set;} 
} 

public class PlayerViewModel{ 
    string name{get;set;} 
} 

这里是我的映射型材

public class LeagueProfile : Profile 
{ 
    public LeagueProfile() 
    { 
     CreateMap<League, LeagueModel>() 
      .ForMember(m => m.Players, opt => opt.MapFrom(c => c.Players)); 

     CreateMap<LeagueModel, League>() 
      .ForMember(m => m.Players, opt => opt.MapFrom(c => c.Players)); 
    } 
} 

public class PlayerProfile : Profile 
    { 
     public PlayerProfile() 
     { 
      CreateMap<PlayerModel, Player>().ForMember(c => c.Parent, opt => opt.MapFrom(s => s.Parent)); 
      CreateMap<Player, PlayerModel>().ForMember(c => c.Parent, opt => opt.MapFrom(s => s.Parent)); 

      CreateMap<ICollection<Player>, ObservableCollection<PlayerModel>>(); 
      CreateMap<ObservableCollection<PlayerModel>, ICollection<Player>>(); 

     } 

    } 

但是当我打电话

league.Players = mapper.Map(model.Players,league.Players); 

我得到

AutoMapper.AutoMapperMappingException was unhandled by user code 
    HResult=-2146233088 
    Message=Error mapping types. 

Mapping types: 
LeagueModel -> League 
UI.Infrastructure.Models.LeagueModel -> DataLayer.Entities.League 

Type Map configuration: 
LeagueModel -> League 
UI.Infrastructure.Models.LeagueModel -> DataLayer.Entities.League 

Property: 
Players 
    Source=Anonymously Hosted DynamicMethods Assembly 
    StackTrace: 
     at lambda_method(Closure , LeagueModel , League , ResolutionContext) 
     at UI.Infrastructure.Services.GenerateRoundService.ConstructRounds() in D:\TFS\TournamentSoftware\UI.Infrastructure\Services\GenerateRoundService.cs:line 29 
     at UI.Infrastructure.Models.LeagueModel.ConstructRounds() in D:\TFS\TournamentSoftware\UI.Infrastructure\Models\LeagueModel.cs:line 108 
     at UI.Infrastructure.Models.LeagueModel.GenerateRounds() in D:\TFS\TournamentSoftware\UI.Infrastructure\Models\LeagueModel.cs:line 86 
     at UI.LeagueModule.ViewModels.LeagueViewModel.GenerateRounds() in D:\TFS\TournamentSoftware\UI.LeaugeModule\ViewModels\LeagueViewModel.cs:line 91 
     at Prism.Commands.DelegateCommand.<>c__DisplayClass1_0.<.ctor>b__0(Object o) 
     at Prism.Commands.DelegateCommandBase.<>c__DisplayClass6_0.<.ctor>b__0(Object arg) 
     at Prism.Commands.DelegateCommandBase.<Execute>d__15.MoveNext() 
    InnerException: 
     HResult=-2146233054 
     Message=Method 'Add' in type 'Proxy<System.Collections.Generic.ICollection`1[[DataLayer.Entities.Player_DataLayer_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. 
     Source=mscorlib 
     TypeName=Proxy<System.Collections.Generic.ICollection`1[[DataLayer.Entities.Player_DataLayer_Version=1.0.0.0_Culture=neutral_PublicKeyToken=null]]_mscorlib_Version=4.0.0.0_Culture=neutral_PublicKeyToken=b77a5c561934e089> 
     StackTrace: 
      at System.Reflection.Emit.TypeBuilder.TermCreateClass(RuntimeModule module, Int32 tk, ObjectHandleOnStack type) 
      at System.Reflection.Emit.TypeBuilder.CreateTypeNoLock() 
      at System.Reflection.Emit.TypeBuilder.CreateType() 
      at AutoMapper.Execution.ProxyGenerator.EmitProxy(Type interfaceType) 
      at AutoMapper.LockingConcurrentDictionary`2.<>c__DisplayClass2_1.<.ctor>b__1() 
      at System.Lazy`1.CreateValue() 
      at System.Lazy`1.LazyInitValue() 
      at System.Lazy`1.get_Value() 
      at AutoMapper.Execution.ProxyGenerator.GetProxyType(Type interfaceType) 
      at lambda_method(Closure , LeagueModel , League , ResolutionContext) 
     InnerException: 

任何人都可以帮我解释一下吗?我在别处寻找类似的问题,并已实施解决方案,但注意到正在工作。

+0

你并不需要创建集合/列表明确的映射。从'PlayerProfile'中删除这些行,它应该可以工作。 – Rabban

+0

谢谢@Rabban,我试过了,但我现在在同一个地方得到了一个堆栈溢出错误。任何想法为什么? – Jack

+0

“玩家”是否指向“联盟”?也许有一个圆圈参考。 – Rabban

回答

0

由于拉班在评论中说,除明确收集转换,然后加入

PreserveReferences() 

到我的个人资料解决了problem./