限制映射到现有目标对象

时间:2019-09-27 14:45:03

标签: c# entity-framework-core automapper nullable-reference-types

我有一个使用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。如果有人有更好的解决方案,我很想听听!

0 个答案:

没有答案