【问题标题】:.NET Core 3 automapper not mapping different name variables? Worked in .NET framework.NET Core 3 自动映射器没有映射不同的名称变量?在.NET框架中工作
【发布时间】:2020-06-20 19:05:08
【问题描述】:

以下是自动映射配置文件。目标Id 的输入格式错误会引发错误。

目标Id 属性甚至没有被映射到。

public class AspGetUserLoginReturnModelToSRSDLUserLoginModel : Profile
{
    public AspGetUserLoginReturnModelToSRSDLUserLoginModel()
    {
        CreateMap<asp_GetUserLoginReturnModel, SRSDLUserLoginModel>()
            .ForMember(dest => dest.UserPassword, opt => opt.MapFrom(src => src.PasswordHash))
            .ForMember(dest => dest.UserId, opt => opt.MapFrom(src => src.Id)              
            ;
    }
}

现在目标类SRSDLUserLoginModel 派生自一个基类,该基类具有一个名为Id 的公共访问器,它是可空类型long

上面使用的源Id 属性是string 类型。

正如上面显示的代码,源Id 映射到目标UserId 属性。

但 Automapper 将源 Id 映射到目标的基础类 Id 属性。

为什么会这样?

代码直截了当,没有什么新的尝试要完成。 它与我使用的大多数其他软件包一样 Automapper?

在完整/经典的 .NET 框架中,这些包运行良好,但在 .NET Core 中,这些包很糟糕?

// source class
public partial class asp_GetUserLoginReturnModel
{
    public string Id { get; set; }
}

// destination classes
public class SRSDLUserLoginModel: SRSDLModel, ISRSDLUserLoginModel
{  
    public string UserId { get; set; }
    public string UserPassword { get; set; }
    //  [...]
}

public class SRSDLModel : ISRSDLModel
{  
    public long? Id { get; set; }
    // [...]
}

【问题讨论】:

  • 复制会有所帮助。创建一个gist,我们可以执行并看到失败。

标签: c# .net-core automapper


【解决方案1】:

AutoMapper 默认会映射同名的属性,因此您不必一直编写它们。在这种情况下,它会尝试使用来自asp_GetUserLoginReturnModel.Id 属性的值来设置SRSDLModel.Id 属性。正如您已经注意到的那样,由于long?string 之间的不匹配,这不起作用。

要解决此问题,请在映射中使用 .Ignore() 方法来指定在映射期间不应设置此特定属性。配置可能如下所示:

.ForMember(dest => dest.Id, i => i.Ignore());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多