2016-04-20 6 views
1

Antwort: CreateMissingTypeMaps muss auf true eingestellt sein, damit dynamisches Mapping funktioniert.AutoMapper mit dynamischem Typ: Fehlende Typ-Map-Konfiguration oder nicht unterstützte Zuordnung

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

Ich habe Wrapper um Entity Framework Abfragen Datenbank auszuführen. Ich möchte dem Benutzer erlauben, nur die erforderlichen Eigenschaften auszuwählen, aber das Ergebnis des Entitätstyps zu behalten.

Dieser Dummy-Code (ohne EF zu verwenden, aber mit derselben Ausgabe)

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

Erhalten dieser Ausnahme:

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 } 

Ich bin hier etwas stecken, weil Dokumentation besagt, dass AutoMapper Eigenschaft verwendet Namen, die auf das Objekt zurückgemappt werden: Dynamic and ExpandoObject Mapping.

Bitte beachten Sie, dass der obige Code ein Beispiel ist. In meiner Anwendung werden die Dinge etwas verrückt, da ich tatsächlich Generika verwende, z.

Mapper.Map<TEntity> 

... und es sollte so bleiben - ich weiß nicht, welcher Entitätstyp verwendet wird. Meine Erwartung ist nur: Karteneigenschaften zum vorhandenen Typ, wenn sie fehlen, setzen Sie .


Edit: Ich habe versucht, Mapper dynamic-T, fast vollständigen Code hier angeben:

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

... dies wird auf Ausnahme nicht sterben, aber Ergebnis verzweifelt leer ist (alle Eigenschaften default Wert hat.

Antwort

1

Sie müssen Mapper.DynamicMap<T> verwenden, anstatt Mapper.Map<T> von dynamischen oder anonymen Klassen zuzuordnen

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

Danke, dass Sie mich auf diese Weise anzeigten, Ihr Vorschlag ist veraltet, aber ich konnte herausfinden, wie ich dies über das Konfigurationsobjekt einstellen kann. –

+0

Richtig, es ist eine obsolete Art und Weise. [Hier] (https://github.com/AutoMapper/AutoMapper/wiki/Migrating-from-static-API) ist eine Dokumentation über die vorzuziehende Art, dies zu konfigurieren (was, wie ich sehen kann, Sie bereits gefunden haben). Ich war froh zu helfen. – MaKCbIMKo

4

Statt veraltet DynamicMap können Sie es global konfigurieren.

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

Reference zum Wiki.

Verwandte Themen