2017-11-14 2 views
0

Ich versuche Autoadapter für .NET Core zu bekommen, und ich scheine etwas Wichtiges zu verpassen.Automapper gibt die "Standard" -Instanz der abgebildeten Entität zurück

Ich habe meinen AutoMapper setzt sich wie folgt zusammen:

In Startup.cs in meiner ConfigureServices Methode, ich habe die folgende Zeile ein:

services.AddAutoMapper(typeof(Startup), typeof(ApplicationDbContext)); 

Ich habe auch eine Klasse MappingProfile genannt, die dies ähnelt:

Die IgnoreAllUnmapped wurde von einer anderen SO Frage vorgeschlagen, und es sieht so aus:

public static IMappingExpression<TSource, TDest> IgnoreAllUnmapped<TSource, TDest>(
     this IMappingExpression<TSource, TDest> expression) 
    { 
     expression.ForAllMembers(opt => opt.Ignore()); 
     return expression; 
    } 

Mein CfGroup sieht wie folgt aus:

[Table("Groups")] 
public class CfGroup 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    [StringLength(100)] 
    [Required] 
    public string Name { get; set; } 

    [DataType(DataType.ImageUrl)] 
    [StringLength(250)] 
    public string ImageUrl { get; set; } 

    [Required] 
    public int FounderId { get; set; } 

    [ForeignKey("FounderId")] 
    public virtual CfUser Founder { get; set; } 

    [Required] 
    public bool IsActive { get; set; } 

    [Required] 
    public DateTime CreatedTimestampUtc { get; set; } 

    [StringLength(3000)] 
    public string About { get; set; } 

    public virtual ISet<UserGroupMember> Members { get; set; } 

    public virtual ISet<UserGroupManager> Managers { get; set; } 
} 

... und meine GroupModel sieht wie folgt aus:

public class GroupModel 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public string ImageUrl { get; set; } 

    public string About { get; set; } 
} 

Wenn meine Web-api Endpunkt aufrufen, erhalte ich eine Sammlung von CfGroup Entitäten aus der Datenbank sind in Ordnung. Ich laufe dann einen Befehl wie so:

var dtos = entities.Select(_mapper.Map<GroupModel>); 

... aber meine dtos sind „leer“ ... IOW, wird die Instanz erstellt, aber Id Wert wird auf 0 gesetzt und alle String-Werte werden auf null. Das ist definitiv nicht das, was in der Variablen entities ist.

Ich habe auch versucht, es explizit zu konvertieren, wie so:

var dtos = entities.Select(x => _mapper.Map<GroupModel>(x)); 

und postulieren, dass es ein IEnumerable Problem ist, versucht, einen List aus ihm heraus:

var dtos = entities.Select(x => _mapper.Map<GroupModel>(x)).ToList(); 

... aber Unabhängig davon, bleiben die DTOs instanziiert, aber alle Eigenschaften sind auf ihre Standardwerte gesetzt.

Was mache ich falsch?

+2

Ich glaube nicht, 'IgnoreAllUnmapped' Erweiterung Methode ist, was Sie wollen. Du hast im Grunde gesagt, ingore mapping für alle Mitglieder. Versuchen Sie es ohne? – 12seconds

+0

Hmm ... es sieht so aus als hättest du recht. Wenn ich das aber nicht habe, schlägt mein 'ConfigurationProvider.AssertConfigurationIsValid()' -Test mit nicht zugeordneten Eigenschaften fehl ... was das 'IgnoreAllUnmapped' eigentlich sein sollte ... sigh –

+1

Diese Erweiterungsmethode funktioniert nur, wenn Sie ordnen Sie sie erneut manuell zu (nach dem Aufruf von '.IgnoreAllUnmapped()', was eine Menge Arbeit ist. – 12seconds

Antwort

0

So stellt sich heraus, dass die IgnoreAllUnmapped nicht der richtige Weg war zu gehen; in der Tat schien das Mapping ohne es gut zu funktionieren. Ich habe den zusätzlichen Code für die "Ausnahmebehandlung" herausgenommen und es funktionierte so, wie ich es wollte. Ich habe es übertrieben.

1

Ich vermute, es könnte sein, weil Sie in Ihrem Linq-Ausdruck zuordnen. so etwas wie dies versuchen:

var dtos = _mapper.Map<IEnumerable<GroupModel>>(entities.ToList()); 
+0

Sie haben Recht. Niemand sollte jemals abbilden, bevor alle Entitäten zurückkehren, es sei denn, Sie verwenden die 'ProjectTo()' AutoMapper-Methode. –

+0

Ich habe das versucht und ich bekomme das gleiche Ergebnis. –

Verwandte Themen