ASP.NET C# 如何将源 ID 映射到目标对象

ASP.NET C# How to map a source Id to a Destionation object

我对自动映射器很陌生,我正在尝试将我的 DTO 对象映射到应该保存在数据库中的实体。这是我的示例代码:

public class SourceObject {
 public int Id {get; set;}
 public string Description {get; set;}
 public int StatusId {get; set;}
}

public class DestinationObject {
 public int Id {get; set;}
 public string Description {get; set;}
 public DestinationStatus Status {get; set;}
}

public DestinationStatus {
 public int Id {get; set;}
 public string Description {get; set;}
}

我如何为 AutoMapper 定义映射配置文件 class,将 SourceObject 的输入 StatusId 属性(简单类型)映射到 DestinationObject 的 DestinationStatus 属性(对象)? 非常感谢您。

你不能。您在这里可以做的最好的事情是为 Status 引用添加一个外键 属性,这样您就可以将键映射到键。 EF 将在您保存时自动对引用执行对象修复。

如果您不能或不愿这样做,那么您唯一的选择就是自定义值解析器,这可能非常低效。本质上,您需要告诉 AutoMapper,为了将 id 映射到 reference prop,它需要使用您的自定义解析器。然后,该自定义解析器将获取 id 并使用它来查询数据库中的对象,然后 return 对象。如果您正在映射事物列表,这将导致 N 个查询,一个用于列表中的每个项目(因此它效率低下且不推荐)。另请注意,查询必须是同步的,而不是异步的,因为 AutoMapper API 不支持异步操作。这可能会在某些情况下导致阻塞问题。

public class StatusResolver : IValueResolver<SourceObject, DestinationObject, DestinationStatus>
{
    private readonly MyContext _context;

    public StatusResolver(MyContext context)
    {
        _context = context;
    }

    public DestinationStatus Resolve(SourceObject source, DestinationObject destination, int member, ResolutionContext context)
    {
        return _context.DestinationStatuses.Find(source.StatusId);
    }
}

然后

.ForMember(dest => dest.Status, opts => opts.MapFrom<StatusResolver>())