Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Automapper中从源代码进行局部映射_C#_Automapper - Fatal编程技术网

C# 如何在Automapper中从源代码进行局部映射

C# 如何在Automapper中从源代码进行局部映射,c#,automapper,C#,Automapper,我试图将4个属性中的2个从对象映射到目标类型。在我的例子中,DeletedBy和DeletedDate,其中as DeletedDate将简单地设置为当前UTC日期 public class DeleteCommand : IRequest { public string CodePath { get; set; } [JsonIgnore] public Guid? DeletedBy { get; set; } [IgnoreMap] public

我试图将4个属性中的2个从对象映射到目标类型。在我的例子中,
DeletedBy
DeletedDate
,其中as DeletedDate将简单地设置为当前UTC日期

public class DeleteCommand : IRequest
{
    public string CodePath { get; set; }

    [JsonIgnore]
    public Guid? DeletedBy { get; set; }

    [IgnoreMap]
    public DeleteMode DeleteMode { get; set; } = DeleteMode.Soft;
}
这是我当前的配置:

CreateMap<DeleteCommand, Asset>(MemberList.Source)
    .ForMember(x => x.DeletedDate, opt => opt.MapFrom(src => DateTime.UtcNow))
    .ForMember(x => x.DeletedBy, opt => opt.MapFrom(src => src.DeletedBy));
未映射属性: 删除数据 删除模式

这让我很困惑,因为日期是显式定义的,并且默认情况下DeleteMode设置为忽略。如果可能的话,我希望通过设置审核字段,避免创建另一个要从第一个dto映射到要软删除的实体的dto

到目前为止我已经尝试过的事情:

  • IgnoreMapAttribute
    如上所示
  • ForSourceMember()
    ,似乎不支持源属性的Ignore方法
删除
DeletedDate
作为属性解决了我50%的问题,因为我不再需要在源代码中使用它

另一个正在使用
ForSourceMember(x=>x.DeleteMode,y=>x.DoNotValidate())更新映射。

这也适用于快速单元测试:

[Fact]
public void DeleteMapShouldSetAuditFields()
{
    var asset = new Asset();
    var cmd = new DeleteCommand
    {
        DeletedBy = Guid.NewGuid()
    };

    _mapper.Map(cmd, asset);

    Assert.NotNull(asset.DeletedBy);
    Assert.NotNull(asset.DeletedDate);
    Assert.Equal(cmd.DeletedBy, asset.DeletedBy);
}

这可以通过从
CreateMap()
的参数列表中删除
MemberList.Source
并忽略所有剩余的未映射目标成员来解决

CreateMap<DeleteCommand, Asset>()
.ForMember(x => x.DeletedDate, opt => opt.MapFrom(src => DateTime.UtcNow))
.ForMember(x => x.DeletedBy, opt => opt.MapFrom(src => src.DeletedBy))
.ForAllOtherMembers(x => x.Ignore())
CreateMap()
.ForMember(x=>x.DeletedDate,opt=>opt.MapFrom(src=>DateTime.UtcNow))
.ForMember(x=>x.DeletedBy,opt=>opt.MapFrom(src=>src.DeletedBy))
.ForAllOtherMembers(x=>x.Ignore())

使用
CreateMap(MemberList.None)
也可以实现同样的效果。这甚至不需要显式忽略所有其他目标成员。

你能展示一下你的
Asset
类型是什么样子吗?我不是100%确定,但我感觉你的源和目标类型的顺序是错误的。我可以,但既然我只想映射两个审核字段,如果我发布两个字段或32个,它会起作用吗?它相当大,所以如果可以的话,我会尽量避免把问题弄乱。@GrzegorzSławecki它是
CreateMap()
,所以我想我的顺序是对的。看起来像
。ForSourceMember(x=>x.DeleteMode,y=>y.DoNotValidate())
似乎能做到这一点。现在我将为它编写一个单元测试。
CreateMap<DeleteCommand, Asset>()
.ForMember(x => x.DeletedDate, opt => opt.MapFrom(src => DateTime.UtcNow))
.ForMember(x => x.DeletedBy, opt => opt.MapFrom(src => src.DeletedBy))
.ForAllOtherMembers(x => x.Ignore())