2010-04-20 67 views
3

我有一個AutoMapper問題,現在已經讓我瘋狂得太久了。 AutoMapper用戶網站也發佈了類似的問題,但沒有得到太多的關注。AutoMapper不適用於Container類

總結是,我有一個包含組件字典的容器類。這些組件是一個公共基類的派生對象。我也有一個平行結構,我正在使用DTO對象來映射它。

生成的錯誤似乎表明映射器無法在我包含在CreateMap調用中的兩個類之間進行映射。我認爲這個錯誤與我有一個不屬於容器層次結構的對象字典有關。

對於下面的代碼長度,我提前表示歉意。我的簡單測試案例工作。不用說,這只是更復雜的失敗案例。

這裏是類:

#region Dto objects 

public class ComponentContainerDTO 
{ 
    public Dictionary<string, ComponentDTO> Components { get; set; } 

    public ComponentContainerDTO() 
    { 
     this.Components = new Dictionary<string, ComponentDTO>(); 
    } 
} 

public class EntityDTO : ComponentContainerDTO 
{ 
    public int Id { get; set; } 

} 

public class ComponentDTO 
{ 
    public EntityDTO Owner { get; set; } 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string ComponentType { get; set; } 
} 

public class HealthDTO : ComponentDTO 
{ 
    public decimal CurrentHealth { get; set; } 

} 

public class PhysicalLocationDTO : ComponentDTO 
{ 
    public Point2D Location { get; set; } 
} 
#endregion 


#region Domain objects 

public class ComponentContainer 
{ 
    public Dictionary<string, Component> Components { get; set; } 

    public ComponentContainer() 
    { 
     this.Components = new Dictionary<string, Component>(); 
    } 
} 

public class Entity : ComponentContainer 
{ 
    public int Id { get; set; } 

} 

public class Component 
{ 
    public Entity Owner { get; set; } 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string ComponentType { get; set; } 

} 

public class Health : Component 
{ 
    public decimal CurrentHealth { get; set; } 
} 

public struct Point2D 
{ 
    public decimal X; 
    public decimal Y; 

    public Point2D(decimal x, decimal y) 
    { 
     X = x; 
     Y = y; 
    } 
} 

public class PhysicalLocation : Component 
{ 
    public Point2D Location { get; set; } 
} 
#endregion 

代碼:

var entity = new Entity() { Id = 1 }; 
var healthComponent = new Health() { CurrentHealth = 100, Owner = entity, Name = "Health", Id = 2 }; 
entity.Components.Add("1", healthComponent); 
var locationComponent = new PhysicalLocation() { Location = new Point2D() { X = 1, Y = 2 }, Owner = entity, Name = "PhysicalLocation", Id = 3 }; 
entity.Components.Add("2", locationComponent); 

Mapper.CreateMap<ComponentContainer, ComponentContainerDTO>() 
    .Include<Entity, EntityDTO>(); 

Mapper.CreateMap<Entity, EntityDTO>(); 

Mapper.CreateMap<Component, ComponentDTO>() 
    .Include<Health, HealthDTO>() 
    .Include<PhysicalLocation, PhysicalLocationDTO>(); 

Mapper.CreateMap<Component, ComponentDTO>(); 
Mapper.CreateMap<Health, HealthDTO>(); 
Mapper.CreateMap<PhysicalLocation, PhysicalLocationDTO>(); 

Mapper.AssertConfigurationIsValid(); 

var targetEntity = Mapper.Map<Entity, EntityDTO>(entity); 

的錯誤,當我調用地圖()(簡稱堆爬):

AutoMapper.AutoMapperMappingException was unhandled 
    Message=Trying to map MapperTest1.Entity to MapperTest1.EntityDTO. 
Using mapping configuration for MapperTest1.Entity to MapperTest1.EntityDTO 
Exception of type 'AutoMapper.AutoMapperMappingException' was thrown. 
    Source=AutoMapper 
    StackTrace: 
     at AutoMapper.MappingEngine.AutoMapper.IMappingEngineRunner.Map(ResolutionContext context) 
. 
. 
. 

    InnerException: AutoMapper.AutoMapperMappingException 
     Message=Trying to map System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MapperTest1.Component, ElasticTest1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] to System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MapperTest1.ComponentDTO, ElasticTest1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]. 
Using mapping configuration for MapperTest1.Entity to MapperTest1.EntityDTO 
Destination property: Components 
Exception of type 'AutoMapper.AutoMapperMappingException' was thrown. 
     Source=AutoMapper 
     StackTrace: 
      at AutoMapper.Mappers.TypeMapObjectMapperRegistry.PropertyMapMappingStrategy.MapPropertyValue(ResolutionContext context, IMappingEngineRunner mapper, Object mappedObject, PropertyMap propertyMap) 
. 
. 

     InnerException: AutoMapper.AutoMapperMappingException 
      Message=Trying to map System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MapperTest1.Component, ElasticTest1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] to System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MapperTest1.ComponentDTO, ElasticTest1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]. 
Using mapping configuration for MapperTest1.Entity to MapperTest1.EntityDTO 
Destination property: Components 
Exception of type 'AutoMapper.AutoMapperMappingException' was thrown. 
      Source=AutoMapper 
      StackTrace: 
       at AutoMapper.MappingEngine.AutoMapper.IMappingEngineRunner.Map(ResolutionContext context) 
       . 
      InnerException: AutoMapper.AutoMapperMappingException 
       Message=Trying to map MapperTest1.Component to MapperTest1.ComponentDTO. 
Using mapping configuration for MapperTest1.Health to MapperTest1.HealthDTO 
Destination property: Components 
Exception of type 'AutoMapper.AutoMapperMappingException' was thrown. 
       Source=AutoMapper 
       StackTrace: 
         at AutoMapper.MappingEngine.AutoMapper.IMappingEngineRunner.Map(ResolutionContext context) 
         . 
. 

       InnerException: AutoMapper.AutoMapperMappingException 
         Message=Trying to map System.Decimal to System.Decimal. 
Using mapping configuration for MapperTest1.Health to MapperTest1.HealthDTO 
Destination property: CurrentHealth 
Exception of type 'AutoMapper.AutoMapperMappingException' was thrown. 
         Source=AutoMapper 
         StackTrace: 
          at AutoMapper.Mappers.TypeMapObjectMapperRegistry.PropertyMapMappingStrategy.MapPropertyValue(ResolutionContext context, IMappingEngineRunner mapper, Object mappedObject, PropertyMap propertyMap) 

. 
. 
         InnerException: System.InvalidCastException 
          Message=Unable to cast object of type 'MapperTest1.ComponentDTO' to type 'MapperTest1.HealthDTO'. 
          Source=Anonymously Hosted DynamicMethods Assembly 
          StackTrace: 
           at SetCurrentHealth(Object , Object) 
. 
. 

謝謝你提前。

裏克

回答

3

事實證明,這是已經被固定在1.1.0.184版中的錯誤。

謝謝吉米修復它。

Rick

相關問題