C# 空值之间的映射异常?
我得到一个例外: 缺少类型映射配置或不支持的映射 映射类型: FollowUpActivityDTO->NullableC# 空值之间的映射异常?,c#,automapper,C#,Automapper,我得到一个例外: 缺少类型映射配置或不支持的映射 映射类型: FollowUpActivityDTO->Nullable1 Elest.Model.FollowUpActivityDTO->System.Nullable1[[System.DateTime,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]] 目标路径: 清单'1[0] 源值: 类后续活动DTO{ 识别号:75e83860-65e4-
1
Elest.Model.FollowUpActivityDTO->System.Nullable
1[[System.DateTime,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]]
目标路径:
清单'1[0]
源值:
类后续活动DTO{
识别号:75e83860-65e4-11e5-9a90-382c4ab9e433
时间戳:28/09/2015 11:28:55
StartTimestamp:28/09/2015 15:26:00
时间戳:28/09/2015 15:26:00
关闭时间戳:28/09/2015 15:26:00
事项:elasticsearch-copia-copia.jar
评论:存档
状态:打开
背景状态:未知
}
当我执行以下操作时,它会引发:
return AutoMapper.Mapper.Map<List<LEST.Model.FollowUpActivityDTO>, List<Domain.FollowUpActivity>>(dtos);
和映射配置文件:
AutoMapper.Mapper.CreateMap<LEST.Model.FollowUpActivityDTO, Domain.FollowUpActivity>()
.ForMember(dst => dst.CreationDate, opts => opts.Ignore()) //opts.MapFrom(s => s.Timestamp.HasValue ? s.Timestamp.Value : DateTime.MinValue))
.ForMember(dst => dst.StartDate, opts => opts.Ignore()) //opts.MapFrom(s => s.StartTimestamp.HasValue ? s.StartTimestamp.Value : DateTime.MinValue))
.ForMember(dst => dst.DueDate, opts => opts.Ignore()) //opts.MapFrom(s => s.DueTimestamp.HasValue ? s.DueTimestamp.Value : DateTime.MinValue))
.ForMember(dst => dst.ClosingDate, opts => opts.Ignore()) //opts.MapFrom(s => s.ClosingTimestamp.HasValue ? s.ClosingTimestamp.Value : DateTime.MinValue));
.ForMember(dst => dst.Status, opts => opts.UseValue<Domain.FollowUpActivityStatus>(Domain.FollowUpActivityStatus.Open))
.ForMember(dst => dst.BacklogStatus, opts => opts.UseValue<Domain.FollowUpActivityBacklogStatus>(Domain.FollowUpActivityBacklogStatus.Work));
AutoMapper.Mapper.CreateMap()
.FormMember(dst=>dst.CreationDate,opts=>opts.Ignore())//opts.MapFrom(s=>s.Timestamp.HasValue?s.Timestamp.Value:DateTime.MinValue))
.FormMember(dst=>dst.StartDate,opts=>opts.Ignore())///opts.MapFrom(s=>s.StartTimestamp.HasValue?s.StartTimestamp.Value:DateTime.MinValue))
.ForMember(dst=>dst.duetate,opts=>opts.Ignore())///opts.MapFrom(s=>s.duetimstamp.HasValue?s.duetimstamp.Value:DateTime.MinValue))
.FormMember(dst=>dst.ClosingDate,opts=>opts.Ignore())//opts.MapFrom(s=>s.ClosingTimestamp.HasValue?s.ClosingTimestamp.Value:DateTime.MinValue));
.FormMember(dst=>dst.Status,opts=>opts.UseValue(Domain.FollowUpActivityStatus.Open))
.FormMember(dst=>dst.BacklogStatus,opts=>opts.UseValue(Domain.FollowUpActivityBacklogStatus.Work));
我创建了一个测试来测试此映射:
namespace Tests
{
[TestFixture]
public class Mapping
{
[SetUp]
public void initialize()
{
Core.Mappings.AutoMapperConfiguration.Configure();
}
[Test]
public void configutation()
{
AutoMapper.Mapper.AssertConfigurationIsValid<Core.Mappings.Profiles.FollowUpActivityProfile>();
}
[Test]
public void followUpActivityDTOToDOMAIN()
{
LEST.Model.FollowUpActivityDTO dto = new LEST.Model.FollowUpActivityDTO()
{
Id = new Guid().ToString(),
Timestamp = DateTime.UtcNow,
StartTimestamp = DateTime.UtcNow,
DueTimestamp = DateTime.UtcNow,
ClosingTimestamp = DateTime.UtcNow,
Matter = "Matter",
Comment = "Comment",
Status = "open",
BacklogStatus = "work",
Metainfos = new System.Collections.Generic.List<LEST.Model.MetaInfoValueDTO>()
};
Domain.FollowUpActivity domain = new Domain.FollowUpActivity();
AutoMapper.Mapper.Map<LEST.Model.FollowUpActivityDTO, Domain.FollowUpActivity>(dto, domain);
domain.Should().NotBeNull();
domain.Id.Should().Be(dto.Id);
}
}
}
命名空间测试
{
[测试夹具]
公共类映射
{
[设置]
公共无效初始化()
{
Core.Mappings.AutoMapperConfiguration.Configure();
}
[测试]
公共无效配置()
{
AutoMapper.Mapper.AssertConfiguration验证();
}
[测试]
public void followupactivitydtotomain()
{
test.Model.FollowUpActivityDTO=新的test.Model.FollowUpActivityDTO()
{
Id=新Guid().ToString(),
时间戳=DateTime.UtcNow,
StartTimestamp=DateTime.UtcNow,
DueTimestamp=DateTime.UtcNow,
ClosingTimestamp=DateTime.UtcNow,
Matter=“Matter”,
Comment=“Comment”,
Status=“打开”,
BacklogStatus=“工作”,
Metainfos=new System.Collections.Generic.List()
};
Domain.FollowUpActivity Domain=新域.FollowUpActivity();
AutoMapper.Mapper.Map(dto,域);
domain.Should().NotBeNull();
domain.Id.Should().Be(dto.Id);
}
}
}
看看:
Domain.FollowUpActivity domain = new Domain.FollowUpActivity();
AutoMapper.Mapper.Map<LEST.Model.FollowUpActivityDTO, Domain.FollowUpActivity>(dto, domain);
Domain.FollowUpActivity Domain=新的Domain.FollowUpActivity();
AutoMapper.Mapper.Map(dto,域);
现在我工作。但是,如果我按以下方式编写代码,它将崩溃:
Domain.FollowUpActivity domain = AutoMapper.Mapper.Map<LEST.Model.FollowUpActivityDTO, Domain.FollowUpActivity>(dto);
Domain.FollowUpActivity Domain=AutoMapper.Mapper.Map(dto);
我发现问题出在目标类的构造函数上,然后:
namespace Domain
{
public enum FollowUpActivityStatus
{
Open,
Closed,
Delegated
}
public enum FollowUpActivityBacklogStatus
{
Work,
Sprint
}
public class FollowUpActivity
{
private String id; // Generated on server
private DateTime? creationDate;
private DateTime? startDate;
private DateTime? dueDate;
private DateTime? closingDate;
private String matter;
private String comment;
private FollowUpActivityStatus status;
private FollowUpActivityBacklogStatus backlogStatus;
private List<MetaInfoValue> metainfos;
private List<MetaResource> resources;
#region Properties
public String Id
{
get { return id; }
set { id = value; }
}
public DateTime? CreationDate
{
get { return creationDate; }
set { creationDate = value; }
}
public DateTime? StartDate
{
get { return startDate; }
set { startDate = value; }
}
public DateTime? DueDate
{
get { return dueDate; }
set { dueDate = value; }
}
public DateTime? ClosingDate
{
get { return closingDate; }
set { closingDate = value; }
}
public FollowUpActivityStatus Status
{
get { return status; }
set { status = value; }
}
public FollowUpActivityBacklogStatus BacklogStatus
{
get { return backlogStatus; }
set { backlogStatus = value; }
}
public String Matter
{
get { return matter; }
set { matter = value; }
}
public String Comment
{
get { return comment; }
set { comment = value; }
}
public List<MetaInfoValue> Metainfos
{
get { return metainfos; }
set { metainfos = value; }
}
public List<MetaResource> Resources
{
get { return resources; }
set { resources = value; }
}
#endregion
#region Constructors
public FollowUpActivity()
: this(null, null)
{
}
public FollowUpActivity(String matter, String comment = null, params Domain.MetaInfoValue[] metainfos)
: this(DateTime.Now, matter, comment, metainfos)
{
}
public FollowUpActivity(DateTime creationDate, String matter, String comment = null, params Domain.MetaInfoValue[] metainfos)
: this(creationDate, matter, new List<MetaResource>(), comment, metainfos)
{
}
public FollowUpActivity(DateTime creationDate, String matter, List<MetaResource> resources, String comment = null, params Domain.MetaInfoValue[] metainfos)
: this(creationDate, matter, FollowUpActivityBacklogStatus.Work, new List<MetaResource>(), comment, metainfos)
{
}
public FollowUpActivity(DateTime creationDate, String matter, FollowUpActivityBacklogStatus backlogStatus, List<MetaResource> resources, String comment = null, params Domain.MetaInfoValue[] metainfos)
: this(creationDate, null, null, null, matter, FollowUpActivityStatus.Open, backlogStatus, new List<MetaResource>(), comment, metainfos)
{
}
public FollowUpActivity(DateTime? creationDate, DateTime? startDate, DateTime? dueDate, DateTime? closingDate, String matter, FollowUpActivityStatus status, FollowUpActivityBacklogStatus backlogStatus, List<MetaResource> resources, String comment = null, params Domain.MetaInfoValue[] metainfos)
{
this.id = String.Empty;
this.creationDate = creationDate;
this.startDate = startDate;
this.dueDate = dueDate;
this.closingDate = closingDate;
this.matter = matter;
this.comment = comment;
this.status = status;
this.backlogStatus = backlogStatus;
this.metainfos = new List<MetaInfoValue>(metainfos);
this.resources = resources;
}
#endregion
}
}
命名空间域
{
公共枚举后续活动状态
{
打开
关闭
委派
}
公共枚举后续活动BackLogStatus
{
工作
冲刺
}
公开课后续活动
{
私有字符串id;//在服务器上生成
私有日期时间?creationDate;
私人日期时间?起始日期;
私人日期时间?决斗日期;
私有日期时间?关闭日期;
私事;
私有字符串注释;
私人后续活动状态;
私人跟进活动backlogStatus backlogStatus;
私有列表元信息;
私人名单资源;
#区域属性
公共字符串Id
{
获取{return id;}
设置{id=value;}
}
公共日期时间?CreationDate
{
获取{return creationDate;}
设置{creationDate=value;}
}
公共日期时间?起始日期
{
获取{return startDate;}
设置{startDate=value;}
}
公开日期时间
{
获取{return dueDate;}
设置{dueDate=value;}
}
公共日期时间?结束日期
{
获取{return closingDate;}
设置{closingDate=value;}
}
公共后续活动状态
{
获取{返回状态;}
设置{status=value;}
}
公共后续活动BacklogStatus BacklogStatus
{
获取{return backlogStatus;}
设置{backlogStatus=value;}
}
公共事务
{
获取{返回物质;}
设置{matter=value;}
}
公共字符串注释
{
获取{返回注释;}
设置{comment=value;}
}
公共列表元信息
{
获取{return metainfos;}
设置{metainfos=value;}
}
公共列表资源
{
获取{返回资源;}
设置{resources=value;}
}
#端区
#区域构造函数
公共后续活动()
:此(空,空)
{
}
public FollowUpActivity(字符串内容,字符串注释=null,参数Domain.MetaInfoValue[]metainfos)
:this(DateTime.Now、matter、comment、metainfos)
{
}
公共FollowUpActivity(DateTime creationDate,字符串内容,字符串注释=null,参数Domain.MetaInfoValue[]metainfos)
:此(创建日期、事项、新列表()、注释、元信息)
{
}
公共后续活动(DateTime creationDate、字符串内容、列表资源、字符串注释=null、参数Domain.MetaInfoValue[]metainfos)
:这(creationDate、matter、FollowUpActivityBacklogStatus.Work、new List()、comment、metainfos)
{
}
公共FollowUpActivity(DateTime creationDate,字符串物质,FollowUpActivityBacklogStatus backlogStatus,列表资源,字符串注释=null,参数D
Domain.FollowUpActivity domain = new Domain.FollowUpActivity();
AutoMapper.Mapper.Map<LEST.Model.FollowUpActivityDTO, Domain.FollowUpActivity>(dto, domain);
Domain.FollowUpActivity domain = AutoMapper.Mapper.Map<LEST.Model.FollowUpActivityDTO, Domain.FollowUpActivity>(dto);
namespace Domain
{
public enum FollowUpActivityStatus
{
Open,
Closed,
Delegated
}
public enum FollowUpActivityBacklogStatus
{
Work,
Sprint
}
public class FollowUpActivity
{
private String id; // Generated on server
private DateTime? creationDate;
private DateTime? startDate;
private DateTime? dueDate;
private DateTime? closingDate;
private String matter;
private String comment;
private FollowUpActivityStatus status;
private FollowUpActivityBacklogStatus backlogStatus;
private List<MetaInfoValue> metainfos;
private List<MetaResource> resources;
#region Properties
public String Id
{
get { return id; }
set { id = value; }
}
public DateTime? CreationDate
{
get { return creationDate; }
set { creationDate = value; }
}
public DateTime? StartDate
{
get { return startDate; }
set { startDate = value; }
}
public DateTime? DueDate
{
get { return dueDate; }
set { dueDate = value; }
}
public DateTime? ClosingDate
{
get { return closingDate; }
set { closingDate = value; }
}
public FollowUpActivityStatus Status
{
get { return status; }
set { status = value; }
}
public FollowUpActivityBacklogStatus BacklogStatus
{
get { return backlogStatus; }
set { backlogStatus = value; }
}
public String Matter
{
get { return matter; }
set { matter = value; }
}
public String Comment
{
get { return comment; }
set { comment = value; }
}
public List<MetaInfoValue> Metainfos
{
get { return metainfos; }
set { metainfos = value; }
}
public List<MetaResource> Resources
{
get { return resources; }
set { resources = value; }
}
#endregion
#region Constructors
public FollowUpActivity()
: this(null, null)
{
}
public FollowUpActivity(String matter, String comment = null, params Domain.MetaInfoValue[] metainfos)
: this(DateTime.Now, matter, comment, metainfos)
{
}
public FollowUpActivity(DateTime creationDate, String matter, String comment = null, params Domain.MetaInfoValue[] metainfos)
: this(creationDate, matter, new List<MetaResource>(), comment, metainfos)
{
}
public FollowUpActivity(DateTime creationDate, String matter, List<MetaResource> resources, String comment = null, params Domain.MetaInfoValue[] metainfos)
: this(creationDate, matter, FollowUpActivityBacklogStatus.Work, new List<MetaResource>(), comment, metainfos)
{
}
public FollowUpActivity(DateTime creationDate, String matter, FollowUpActivityBacklogStatus backlogStatus, List<MetaResource> resources, String comment = null, params Domain.MetaInfoValue[] metainfos)
: this(creationDate, null, null, null, matter, FollowUpActivityStatus.Open, backlogStatus, new List<MetaResource>(), comment, metainfos)
{
}
public FollowUpActivity(DateTime? creationDate, DateTime? startDate, DateTime? dueDate, DateTime? closingDate, String matter, FollowUpActivityStatus status, FollowUpActivityBacklogStatus backlogStatus, List<MetaResource> resources, String comment = null, params Domain.MetaInfoValue[] metainfos)
{
this.id = String.Empty;
this.creationDate = creationDate;
this.startDate = startDate;
this.dueDate = dueDate;
this.closingDate = closingDate;
this.matter = matter;
this.comment = comment;
this.status = status;
this.backlogStatus = backlogStatus;
this.metainfos = new List<MetaInfoValue>(metainfos);
this.resources = resources;
}
#endregion
}
}