C# 使用ReverseMap和自定义值解析器,从多个属性到复杂对象的自动映射失败

C# 使用ReverseMap和自定义值解析器,从多个属性到复杂对象的自动映射失败,c#,mapping,automapper,automapper-10,C#,Mapping,Automapper,Automapper 10,我在将多个属性反向映射回复杂对象时遇到了一些问题,即使使用自定义值解析器也是如此 以下是持久性模型: 公共类EmailDbo { public int EmailId{get;set;} public DateTime DateCreated{get;set;} 公共日期时间?日期发送{get;set;} 公共字符串SendTo{get;set;} 公共字符串主题{get;set;} 公共字符串体{get;set;} 公共bool下载可用{get;set;} 公共日期时间?AdminDateSe

我在将多个属性反向映射回复杂对象时遇到了一些问题,即使使用自定义值解析器也是如此

以下是持久性模型:

公共类EmailDbo
{
public int EmailId{get;set;}
public DateTime DateCreated{get;set;}
公共日期时间?日期发送{get;set;}
公共字符串SendTo{get;set;}
公共字符串主题{get;set;}
公共字符串体{get;set;}
公共bool下载可用{get;set;}
公共日期时间?AdminDateSent{get;set;}
公共字符串AdminEmail{get;set;}
公共字符串AdminSubject{get;set;}
公共字符串AdminBody{get;set;}
public int StatusId{get;set;}
}
我从数据库中获得了简洁的地图数据,并填写了这个模型


以下是我想用持久性模型来回映射的域模型:

公共类电子邮件
{
公共字符串SendTo{get;private set;}
公共字符串主题{get;private set;}
公共字符串体{get;private set;}
public DateTime?DateSent{get;private set;}
公共电子邮件(字符串sendTo、字符串主题、字符串正文、DateTime?dateSent=null)
{
//验证
this.SendTo=SendTo;
this.Subject=主语;
这个。身体=身体;
this.DateSent=DateSent;
}
}
公共枚举电子邮件任务状态
{
发送=1,
未发送=2
}
公共类电子邮件任务
{
public int Id{get;private set;}
public DateTime DateCreated{get;private set;}
公共电子邮件地址{get;private set;}
公共电子邮件管理电子邮件{get;private set;}
public bool DownloadAvailableForAdmin{get;private set;}
公共EmailTaskStatus状态{get;private set;}
公共EmailTask(int emailTaskId、DateTime dateCreated、Email PayerMail、Email adminEmail、,
bool下载可用,EmailTaskStatus状态)
{
//验证
this.Id=emailTaskId;
this.DateCreated=DateCreated;
this.PayerEmail=PayerEmail;
this.admineal=admineal;
this.DownloadAvailableForAdmin=下载可用;
这个状态=状态;
}
}
我想为付款人和管理员电子邮件使用一个名为
Email
的值对象。可以看出它们只是扁平地存储在数据库/持久性模型中。需要支付人电子邮件,但不需要管理员电子邮件


我对映射进行了如下配置:

公共类映射配置文件:配置文件
{
公共映射配置文件()
{
CreateMap()
.ForMember(dest=>dest.EmailId,opts=>opts.MapFrom(src=>src.Id))
.FormMember(dest=>dest.SendTo,opts=>opts.MapFrom(src=>src.PayerEmail.SendTo))
.FormMember(dest=>dest.Subject,opts=>opts.MapFrom(src=>src.PayerEmail.Subject))
.FormMember(dest=>dest.Body,opts=>opts.MapFrom(src=>src.PayerEmail.Body))
.FormMember(dest=>dest.DateSent,opts=>opts.MapFrom(src=>src.PayerEmail.DateSent))
.FormMember(dest=>dest.DownloadAvailable,opts=>opts.MapFrom(src=>src.DownloadAvailableForAdmin))
.ForMember(dest=>dest.admineal,opts=>
{
opts.predition(src=>(src.admineal!=null));
opts.MapFrom(src=>src.admineal.SendTo);
})
.FormMember(dest=>dest.AdminSubject,opts=>
{
opts.predition(src=>(src.admineal!=null));
opts.MapFrom(src=>src.admineal.Subject);
})
.ForMember(dest=>dest.AdminBody,opts=>
{
opts.predition(src=>(src.admineal!=null));
opts.MapFrom(src=>src.admineal.Body);
})
.FormMember(dest=>dest.AdminDateSent,opts=>
{
opts.predition(src=>(src.admineal!=null));
opts.MapFrom(src=>src.admineal.DateSent);
})
.ForMember(dest=>dest.StatusId,opts=>opts.MapFrom(src=>(int)src.Status))
.ReverseMap()
.ForCtorParam(“status”,opts=>opts.MapFrom(src=>src.StatusId))
.ForMember(dest=>dest.PayerEmail,opts=>opts.MapFrom())
.FormMember(dest=>dest.AdminEmail,opts=>opts.MapFrom,用于:

公共类PayerMailValueResolver:IValueResolver
{
公共电子邮件解析(EmailDbo EmailDbo、EmailTask EmailTask、电子邮件、解析上下文)
{
返回新电子邮件(emailDbo.SendTo、emailDbo.Subject、emailDbo.Body、emailDbo.DateSent);
}
}
公共类AdminEmailValueResolver:IValueResolver
{
公共电子邮件解析(EmailDbo EmailDbo、EmailTask EmailTask、电子邮件、解析上下文)
{
if(String.IsNullOrWhiteSpace(emailDbo.AdminEmail)&&
String.IsNullOrWhiteSpace(emailDbo.AdminSubject)&&
String.IsNullOrWhiteSpace(emailDbo.AdminBody)&&
!emailDbo.AdminDateSent.HasValue)
{
返回null;
}
返回新电子邮件(emailDbo.SendTo、emailDbo.Subject、emailDbo.Body、emailDbo.DateSent);
}
}

与往常一样,从域模型到Dbo的映射工作正常:

但不是相反,从Dbo到域模型。它会引发异常:

未处理的异常。System.ArgumentException:程序+EmailTask需要具有具有0个参数或仅具有可选参数的构造函数。(参数“类型”) 在lambda_method32(闭包、对象、EmailTask、ResolutionContext) 在AutoMapper.Mapper.MapCore[TSource,TDestination](TSource-source,TDestination-destination-destination,ResolutionContext-context-context,类型sourceType,类型destinationType,IMemberMap-memberMap) 在AutoMapper.Mapper.Map[TSource,TDestination](TSource source,TDestination dest
public EmailTask()
{
    // AutoMapper use only
}
public Email()
{
    // AutoMapper use only
}
public Email PayerEmail { get; set; }
public Email AdminEmail { get; set; }
CreateMap<EmailDbo, EmailTask>()
    .ConstructUsing((s, d) =>
        new EmailTask(
                s.EmailId,
                s.DateCreated,
                Helper.GetPayerEmail(s),
                Helper.GetAdminEmail(s),
                s.DownloadAvailable,
                (EmailTaskStatus)s.StatusId))
    .IgnoreAllPropertiesWithAnInaccessibleSetter();
public class Helper
{
    public static Email GetPayerEmail(EmailDbo emailDbo)
    {
        return new Email(emailDbo.SendTo, emailDbo.Subject, emailDbo.Body, emailDbo.DateSent);
    }

    public static Email GetAdminEmail(EmailDbo emailDbo)
    {
        if (string.IsNullOrWhiteSpace(emailDbo.AdminEmail) && string.IsNullOrWhiteSpace(emailDbo.AdminSubject)
            && string.IsNullOrWhiteSpace(emailDbo.AdminBody) && !emailDbo.AdminDateSent.HasValue)
        {
            return null;
        }
        return new Email(emailDbo.SendTo, emailDbo.Subject, emailDbo.Body, emailDbo.DateSent);
    }
}