首页 > 解决方案 > Automapper - 不映射

问题描述

我正在发出 SOAP 请求并得到响应。因此,为了发送一个我正在传递的请求ContractLoad,我从中映射ContractLoadDTO它,它工作得很好。阅读响应时,我试图将响应映射ContractLoadResultContractLoadDTO未映射到的 DTO。我创建了两张地图:

CreateMap<ContractLoadResult, ContractLoadResultDTO>(); // does not work
CreateMap<ContractLoadDTO, ContractLoad> (); // works

我的课程:

 public class ContractLoadDTO
    {
        public int carrierId { get; set; }
        public int contractId { get; set; }
        public double amount { get; set; }
        public string refNum { get; set; }
    }  

 [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.7.3056.0")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://com.test.carriergroup.service/types")]
    public partial class ContractLoad {

        private int carrierIdField;

        private int contractIdField;

        private double amountField;

        private string refNumField;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
        public int carrierId {
            get {
                return this.carrierIdField;
            }
            set {
                this.carrierIdField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
        public int contractId {
            get {
                return this.contractIdField;
            }
            set {
                this.contractIdField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
        public double amount {
            get {
                return this.amountField;
            }
            set {
                this.amountField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)]
        public string refNum {
            get {
                return this.refNumField;
            }
            set {
                this.refNumField = value;
            }
        }
    }

那些被正确映射并且没有问题,但第二个现在正在工作:类:

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.7.3056.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://com.test.carriergroup.service/types")]
public partial class ContractLoadResult {

    private int carrierIdField;

    private int contractIdField;

    private double balanceField;

    private int errorCodeField;

    private string stackTraceField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public int carrierId {
        get {
            return this.carrierIdField;
        }
        set {
            this.carrierIdField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public int contractId {
        get {
            return this.contractIdField;
        }
        set {
            this.contractIdField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public double balance {
        get {
            return this.balanceField;
        }
        set {
            this.balanceField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public int errorCode {
        get {
            return this.errorCodeField;
        }
        set {
            this.errorCodeField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)]
    public string stackTrace {
        get {
            return this.stackTraceField;
        }
        set {
            this.stackTraceField = value;
        }
    }
} 

和:

 public class ContractLoadResultDTO
    {
        public int carrierIdField { get; set; }

        public int contractIdField { get; set; }

        public double balanceField { get; set; }

        public int errorCodeField { get; set; }

        public string stackTraceField { get; set; }

    }

将值传递给 Soap Requesting 时:

ContractLoad[] loads = new ContractLoad[ContractInfo.conractLoads.Length];
loads = Mapper.Map<ContractLoadDTO[], ContractLoad[]>(ContractInfo.conractLoads);

loads包含ContractInfo.conractLoads数组中的值。

阅读回复时:

ContractLoadResultDTO[] loadResult = new ContractLoadResultDTO[response.loadResults.Length];                        
loadResult = Mapper.Map<ContractLoadResult[], ContractLoadResultDTO[]>(response.loadResults);

loadResult的值为“0”。我做错什么了吗?

标签: c#automapper

解决方案


AutoMapper 期望类中的成员与默认情况下映射它们的类中的成员具有完全相同的名称。在您不起作用的示例中,您的 DTO 类已field添加到每个成员,因此它与其他类不匹配。因此,除非您要手动映射变量,否则您的 DTO 类应如下所示:

public class ContractLoadResultDTO
{
    public int carrierId { get; set; }
    public int contractId { get; set; }
    public double balance { get; set; }
    public int errorCode { get; set; }
    public string stackTrace { get; set; }
}

只是为没有使用 AutoMapper 的人添加上下文的附加说明,虽然这里存在同名的私有变量,但 AutoMapper 看不到它们,因此无法复制它们的值。


推荐阅读