2016-02-09 3 views
7
public class Person 
{ 
    Name { get; set; } 
    IEnumerable<Address> Addresses { get; set; } 
} 

public class PersonModel 
{ 
    Name { get; set; } 
    IEnumerable<AddressModel> Addresses { get; set; } 
} 

Wenn ich Person-PersonModel wie so zugeordnet:AutoMapper eine leere Sammlung zurückkehren, möchte ich eine null

Mapper.DynamicMap<Person, PersonModel>(person); 

Wenn die Addresses Eigenschaft auf Person null ist sie auf PersonModel als leere Enumerable abgebildet werden statt von null.

Wie bekomme ich PersonModel null statt einer leeren Enumerable?

+1

Warum 'DynamicMap' über' Map'? – CodingGorilla

+0

Ja, das ist ein schrecklicher Fehler in AutoMapper. Was ist, wenn Sie eine Entität in EF haben, in die Sie explizit eine Sammlung laden? Sie entscheiden, dass Sie die Sammlung nicht laden müssen, und speichern Sie dann die Daten, nachdem Sie das Objekt von Ihrem dto auf den EF-Typ gemappt haben und die Informationen beim Speichern für immer ausräumen. – jwize

+0

Nicht nur das, wir haben auch virtuell auf unsere Kollektionen gesetzt. Nachdem wir alle virtuellen ICollection-Eigenschaften entfernt hatten, waren wir von massiven Datenverlusten betroffen. – jwize

Antwort

6

So gibt es wahrscheinlich mehr Möglichkeiten, wie Sie dies mit AutoMapper erreichen können, und das ist nur einer:

Mapper.CreateMap<Person, PersonMap>() 
    .AfterMap((src, dest) => dest.Addresses = dest.Addresses?.Any() ? dest.Addresses : null); 

Dieser Code verwendet die neuen C# ?. Operator für null Sicherheit, so dass Sie, dass brächten müssen und Überprüfen Sie auf Null, wenn Sie diese Funktion nicht in Ihrem Code verwenden können.

+0

Ist das der beste Weg? Der richtigste Weg? Erlaubt mir auch nicht, Mapper.DynamicMap zu verwenden. – c0D3l0g1c

+1

Hängt stark von Ihrer Situation ab, wenn Sie die Projektionsfunktionen von Automapper verwenden, funktioniert das nicht (oder es war nicht das letzte Mal, dass ich den Automapper benutzt habe). Wenn Sie nur ein einzelnes Modell auf einmal machen, dann ist das für mich absolut akzeptabel [für mich]. – CodingGorilla

+0

@ c0D3l0g1c Ich fragte in einem Kommentar zu der Frage, warum Sie DynamicMap wollten, gibt es einen bestimmten Grund dafür? – CodingGorilla

1

Sie sollten in der Lage sein, einen benutzerdefinierten Resolver für die Eigenschaft zu definieren, für die dieses Verhalten gelten soll. So etwas wie:

1

Eine andere Alternative dazu ist eine Bedingung zu verwenden, also nur den Wert zuordnen, wenn der Wert nicht null ist. Dies kann verlangen, dass der Standardwert auf null

(wie abgebildet werden wont)
Mapper.CreateMap<Person, PersonModel>() 
.ForMember(
    dest => dest.Addresses, 
    opt => opt => opt.Condition(source=> source.Addresses!= null)); 
2

Die einfache Antwort ist AllowNullCollections zu verwenden:

AutoMapper.Mapper.Initialize(cfg => 
{ 
    cfg.AllowNullCollections = true; 
}); 

oder wenn Sie die Instanz API

new MapperConfiguration(cfg => 
{ 
    cfg.AllowNullCollections = true; 
} 
verwenden
+0

Das sollte die richtige Antwort sein, ersparte mir etwas Zeit, danke. –

Verwandte Themen