2016-08-09 117 views
0

Ich verwende AutoMapper für Objekt-Mapping. Manchmal ist der Quellwert gleich Null, also möchte ich ihn durch "" ersetzen, anstatt NULL in die Datenbank zu setzen. Das Quellobjekt hat viele Nullable-Datentypen wie Date, Decimal und Int. Derzeit bin ich mitKein Zwangsoperator ist zwischen den Typen 'System.String' und 'System.Nullable`1 [System.DateTime]' definiert.

public class Invoice 
    { 
     public Guid Id { get; set; } 
     public string Number { get; set; }   
     public Contact Contact { get; set; }   
     public InvoiceType Type { get; set; } 
     public InvoiceStatus Status { get; set; } 
     public LineAmountType LineAmountTypes { get; set; }  
     public DateTime? Date { get; set; }   
     public DateTime? DueDate { get; set; }   
     public DateTime? ExpectedPaymentDate { get; set; }   
     public DateTime? PlannedPaymentDate { get; set; }   
     public decimal? SubTotal { get; set; }   
     public decimal? TotalTax { get; set; }   
     public decimal? Total { get; set; }   
     public decimal? TotalDiscount { get; set; 
     public decimal? CurrencyRate { get; set; }   
     public DateTime? FullyPaidOnDate { get; set; }   
     public decimal? AmountDue { get; set; }   
     public decimal? AmountPaid { get; set; }   
     public decimal? AmountCredited { get; set; } 

    } 

public partial class TempInvoice 
    { 
     public int RowId { get; set; } 
     public System.Guid InvoiceID { get; set; } 
     public string InvoiceNumber { get; set; } 
     public Nullable<System.Guid> ContactID { get; set; } 
     public string Type { get; set; } 
     public string Status { get; set; } 
     public string LineAmountType { get; set; } 
     public Nullable<System.DateTime> InvoiceDate { get; set; } 
     public Nullable<System.DateTime> DueDate { get; set; } 
     public Nullable<System.DateTime> ExpectedPaymentDate { get; set; } 
     public Nullable<System.DateTime> PlannedPaymentDate { get; set; } 
     public Nullable<decimal> SubTotal { get; set; } 
     public Nullable<decimal> TotalTax { get; set; } 
     public Nullable<decimal> Total { get; set; } 
     public Nullable<decimal> TotalDiscount { get; set; } 
     public Nullable<decimal> CurrencyRate { get; set; } 
     public Nullable<System.DateTime> FullyPaidOnDate { get; set; } 
     public Nullable<decimal> AmountDue { get; set; } 
     public Nullable<decimal> AmountCredited { get; set; } 
    } 


    public class InvoiceMapper : Profile 
     { 
      public InvoiceMapper() 
      { 
       CreateMap<Invoice, TempInvoice>() 
        .ForMember(des => des.PaymentID, map => map.MapFrom(src => src.Id)) 
        .ForMember(des => des.InvoiceID, map => map.MapFrom(src => src.Invoice.Id)) 
        .ForMember(des => des.PaymentDate, map => map.MapFrom(src => src.Date)) 
        .ForAllMembers(src => src.NullSubstitute(""))//this doesn't work 
        ; 
      } 
     } 

aber ich bin der obigen Fehler. Gibt es eine Möglichkeit, den Datatime-Typ auszuschließen und int oder dezimal auf 0 und String auf "" zu setzen? Gibt es eine generische Methode, die ich für alle Datentypen verwenden kann? Danke

+1

Einfach wie kann Datetime selbst "" nimmt, ist dies ein String-Typ so unvereinbar. 'DateTime dt =" "ist eine falsche Verwendung –

+0

Ich bin mir dessen bewusst, gibt es eine Möglichkeit, den Datatime-Typ auszuschließen und Int oder Dezimal auf 0 und String auf" " –

+0

Check diesen Link - http: // stackoverflow. com/a/35949590/1559611 können Sie die Option wie folgt verwenden: '.ForMember (dest => (...), opt => { opt.Condition (src => Nullbedingung); opt.MapFrom (src => Tatsächliche Zuordnung) ' Die beste Option ist eine separate Nullzuordnung für jeden Typ, anstatt einen für alle zu versuchen –

Antwort

0

Sie können eine Resolver-Funktion mit ResolveUsing verwenden, indem Sie Ihre eigene benutzerdefinierte Zuordnungsfunktion verwenden, die eine leere Zeichenfolge zurückgibt, wenn das Ziel eine Zeichenfolge ist, andernfalls null.

Zum Beispiel:

private static object MyMapperResolver(object source, bool returnEmptyString = true) { 
     return source ?? (returnEmptyString ? "" : source); 
    } 

    public static IMapper InitMappings() { 
     Mapper.Initialize(cfg => { 
      cfg.CreateMap<Invoice, TempInvoice>() 
       .ForMember(des => des.PaymentID, map => map.ResolveUsing(src => MyMapperResolver(src.Id))) 
       .ForMember(des => des.InvoiceID, map => map.ResolveUsing(src => MyMapperResolver(src.Invoice.Id))) 
       .ForMember(des => des.PaymentDate, map => map.ResolveUsing(src => MyMapperResolver(src.Date, false))) 
       ; 
     }); 
     return Mapper.Instance; 
    }