Ich muss Klassen wie
class A
{
public int id {get; set;}
}
class B
{
public C c {get; set;}
}
class C
{
public int id {get; set;}
public string Name {get; set;}
}
Meine Anforderung ist es, die ID der Klasse A der ID der Klasse C zuzuordnen. Jetzt habe ich: Mapper.CreateMap (). ForMember (des => des.C.Id, src => src.MapFrom (x => x.id));
und es hat gut funktioniert.
Jetzt scheint Auto Mapper ihre Implementierung geändert zu haben. und ich bekomme eine Warnung wie folgt:
AutoMapper.Mapper.CreateMap () 'ist obsolet:' Karten, die dynamisch erstellt werden, werden in Version 5.0 entfernt. Verwenden Sie eine MapperConfiguration-Instanz, und speichern Sie sie bei Bedarf statisch oder Mapper.Initialize. Verwenden Sie CreateMapper, um eine Mapper-Instanz zu erstellen.
Ich muss einige Eigenschaften von Klassen zuordnen, die einen anderen Namen und eine andere Struktur haben. Jede Hilfe dazu.
Vorher
Mapper.CreateMap<Src, Dest>()
.ForMember(d => d.UserName, opt => opt.MapFrom(/* ????? */));
Das Problem hierbei ist, dass Zuordnungsdefinitionen statisch sind, einmal definiert und während der gesamten Lebensdauer der Anwendung wiederverwendet werden. Vor 3.3 müssen Sie das Mapping für jede Anforderung mit dem fest codierten Wert neu definieren. Da die Mapping-Konfiguration an einem anderen Ort als unsere Mapping-Ausführung erstellt wird, benötigen wir einen Weg, um einen Laufzeitparameter in unsere Konfiguration einzuführen und ihn dann während der Ausführung anzugeben.
Dies geschieht in zwei Teilen: Die Mapping-Definition, in der wir einen Laufzeitparameter erstellen, und dann zur Ausführungszeit, wenn wir ihn angeben. Um die Mapping-Definition mit einem Laufzeitparameter zu erstellen, "fälschen" wir eine Schließung, die eine benannte lokale Variable enthält:
Mapper.Initialize(cfg => {
string userName = null;
cfg.CreateMap<Source, Dest>()
.ForMember(d => d.UserName,
opt => opt.MapFrom(src => userName)
);
});
Weitere Informationen siehe diese
Für eine oder mehrere Klassen
cfg.CreateMissingTypeMaps = true;
cfg.CreateMap<Source, Dest>()
.ForMember(d => d.UserName,
opt => opt.MapFrom(src => userName)
);
cfg.CreateMap<AbcEditViewModel, Abc>();
cfg.CreateMap<Abc, AbcEditViewModel>();
});
In der Mapping-Klasse
IMapper mapper = config.CreateMapper();
var source = new AbcEditViewModel();
var dest = mapper.Map<AbcEditViewModel, Abct>(source);
Ein anderer Weg, der etwas sauberer erscheint, ist das Erstellen einer MappingProfile-Klasse, die von der Profile-Klasse von AutoMapper erbt
public class MappingProfile:Profile
{
public MappingProfile()
{
CreateMap<Source1, Destination1>();
CreateMap<Source2, Destination2>();
...
}
}
Dann initialisieren Sie das Mapping mit Mapper.Initialize(c => c.AddProfile<MappingProfile>());
in Ihrem Startcode
Auf diese Weise können Sie das Mapping an beliebiger Stelle durch Aufrufen verwenden
destination1Collection = source1Collection.Select(Mapper.Map<Source1, Destination1>);
Endlich fand ich die Auflösung. Ich machte: Mapper.Initialize{ Mapping field from source to destination }
im App_start und fügte diese Datei zu global.asax -> Application_Start () -> GlobalConfiguration hinzu.
Ich muss eine weitere Zeile in Mapper.Initialize einfügen, die cfg.CreateMissingTypeMaps = true;
ist.
Dieser Code funktioniert jetzt für die explizite Zuordnung, bei der zwei Klassen nicht die gleiche Struktur und Namen von Eigenschaften haben.
Abgesehen davon funktioniert der Code Mapper.map(source, destination)
auch, wenn wir Eigenschaften von zwei Klassen mit derselben Struktur abbilden müssen, was zuvor nicht funktioniert hat.
Lassen Sie mich wissen, wenn jemand Probleme mit der Lösung hat. Vielen Dank für die obige Antwort.