2016-04-20 90 views
1

答案:CreateMissingTypeMaps必須設置爲true才能使動態映射工作。帶有動態類型的AutoMapper:缺失類型映射配置或不支持映射

public IEnumerable<T> GetDummies<T>(IEnumerable<dynamic> dummies) 
    { 
     var config = 
      new MapperConfiguration(c => { c.CreateMissingTypeMaps = true; }); 

     IMapper mapper = config.CreateMapper(); 
     return dummies.Select(mapper.Map<T>).ToList(); 
    } 

我周圍的包裝實體框架執行查詢數據庫。我想讓用戶只選擇需要的屬性,但保留實體類型的結果。

這是假的代碼(不使用EF,但有相同的問題)

class Program 
{ 
    static void Main(string[] args) 
    { 
     var dummies = new[] 
     { 
      new DummyContainer 
      { 
       Name = "First", 
       Description = "First dummy", 
       DummyNumbers = new List<int> { 1, 2, 3 }, 
       Foo = new FooThingy { Title = "Foo thingy" } 
      } 
     }; 

     var smallDummies = dummies.Select(d => new { d.Name }).ToList(); 
     List<DummyContainer> fullDummies = smallDummies.Select(Mapper.Map<DummyContainer>).ToList(); 

     Debugger.Break(); 
    } 
} 

class DummyContainer 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public ICollection<int> DummyNumbers { get; set; } 
    public FooThingy Foo { get; set; } 
} 

class FooThingy 
{ 
    public string Title { get; set; } 
} 

獲取此異常:

Missing type map configuration or unsupported mapping. 

Mapping types: 
<>f__AnonymousType0`1 -> DummyContainer 
<>f__AnonymousType0`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] -> AutoMapperWithGenerics.DummyContainer 

Destination path: 
DummyContainer 

Source value: 
{ Name = First } 

我有點困在這裏,因爲文檔指出AutoMapper使用性質名稱映射回對象:Dynamic and ExpandoObject Mapping

請注意,上面的代碼是例子。在我的應用程序中,事實上有點瘋狂,因爲我實際上在使用泛型,例如

Mapper.Map<TEntity> 

...它應該保持這種狀態 - 我不知道使用了哪種實體類型。我的期望是:將屬性映射到現有類型,如果缺失,請設置default(T)


編輯:我試圖從dynamic指定映射到T,幾乎全碼在這裏:

class Program 
{ 
    static void Main(string[] args) 
    { 
     // ... 

     var dumminator = new DummyService(); 
     IEnumerable<DummyContainer> bigDummies = dumminator.GetDummies<DummyContainer>(smallDummies); 

     Debugger.Break(); 
    } 
} 

class DummyService 
{ 
    public IEnumerable<T> GetDummies<T>(IEnumerable<dynamic> dummies) 
    { 
     var config = new MapperConfiguration(c => c.CreateMap<dynamic, T>()); 
     IMapper mapper = config.CreateMapper(); 

     return dummies.Select(mapper.Map<T>).ToList(); 
    } 
} 

...這將不會例外死,但結果是拼命空(所有屬性有default值。

回答

1

您需要使用Mapper.DynamicMap<T>而不是Mapper.Map<T>從動態或匿名類映射

List<DummyContainer> fullDummies = smallDummies.Select(Mapper.DynamicMap<DummyContainer>).ToList(); 
+0

感謝您以這種方式指向我,您的建議已棄用,但我能夠找到如何通過配置對象設置此選項。 –

+0

對,這是一種過時的方式。 [這裏](https://github.com/AutoMapper/AutoMapper/wiki/Migrating-from-static-API)是一個關於配置這個更好的方法的文檔(正如我看到的,你已經找到了)。我很樂意提供幫助。 – MaKCbIMKo

4

而不是已棄用DynamicMap您可以全局配置它。

var config = new MapperConfiguration(cfg => cfg.CreateMissingTypeMaps = true); 

Reference到wiki。

相關問題