我有一个使用AutoMapper和Entity Framework Core的项目,我刚刚升级为使用C#8的新可为空的引用类型(Nullable Reference Types @ .NET Conf 2019)。
按照Microsoft关于using nullable reference types with EF Core的建议,我为实体类创建了构造函数,并为其提供了必需属性的参数,以确保它们不能为空。
我要更新实体说明时使用以下实体类型和补丁类型:
public class DocType {
public string Code { get; set; }
public string Description { get; set; }
public int? SortIndex { get; set;}
// I added this after the C#8 upgrade
public DocType(string code, string description) {
Code = code;
Description = description;
}
}
public class ModifyDocTypePatch {
public string? Description { get; set; }
public int SortIndex { get; set; }
}
现在,我需要能够将DocType
映射到ModifyDocTypePatch
并返回。需要注意的是,当映射回DocType
时,只应允许我映射到现有的DocType
,而不要创建新的。{p>
在升级之前,我具有以下映射配置文件:
public class DocTypeProfile : Profile {
public DocTypeProfile() {
CreateMap<DocType, ModifyDocType>()
.ReverseMap();
}
}
这工作正常,但是在添加构造函数之后却没有。 AutoMapper需要无参数构造函数。我以为我可以使用.ConstructUsing()
方法告诉automapper从ModifyDocTypePatch
映射回去时使用新的构造函数,但这不起作用,因为构造函数需要代码,而补丁程序也不需要有一个。
是否可以创建仅适用于现有目标对象的映射?这样我就可以做到:
var docType = new DocType("code", "description");
var patch = new ModifyDocTypePatch { Description = "new description" };
var mapped = _mapper.Map(patch, docType);
但不是:
var patch = new ModifyDocTypePatch { Description = "new description" };
var mapped = _mapper.Map<ModifyDocTypePatch, DocType>(patch);
多亏了Lucian的提示,我才提出了解决方法。
我向DocType
添加了一个私有的无参数构造函数。这似乎满足了AutoMappers构造函数的要求。我还向我的个人资料中添加了DisableConstructorMapping()
,因为新的(参数化的)构造函数导致一些我标记的属性被映射。
虽然这是可行的,但我不满意的是需要更改域模型以适应AutoMapper。如果有人有更好的解决方案,我很想听听!