Automapper:在对象列表中映射属性

Bab*_*sus 1 .net c# automapper

我有一个 DTO 列表,并希望将此列表映射到实体列表。实体本身拥有一个来自另一来源的属性。我可以使用一张地图将此属性映射到列表中的所有项目吗?

我的课程:

实体:

public class Account
{
   public int Id {get;set;}
   public string Name {get;set;}
   public Guid ExternalId {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

数据传输对象:

public class ExternalAccountDto
{
   public int Id {get;set;}
   public string Name {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

我的服务:

public class AccountService
{
   public async Task AddExternalAccounts(Guid externalId, List<ExternalAccountDto> accounts)
   {            
        var entities = _mapper.Map(accounts);
        // TODO: Map 'externalId' to all entities
        // _mapper.Map(externalId, entities); // DOES NOT WORK!

        _context.Create(entities);
   }

}
Run Code Online (Sandbox Code Playgroud)

测绘

public class AccountProfile: Profile
{
   public AccountProfile()
   {
      CreateMap<ExternalAccountDto, Account>();

      // TODO: CreateMap for Guid on every Account
   }
}
Run Code Online (Sandbox Code Playgroud)

谁能给我一些建议吗!

Tho*_*ken 5

您应该使用该AfterMap函数对映射的项目进行一些后处理。

有两种方法可以解决这个问题。一种是使用映射配置文件中静态定义的内容。但就您而言,您拥有一些在运行时动态的东西,例如ExternalId. 在你的 then 中做后图AccountService是非常有意义的。

我发现这种结构非常有用,特别是当我想咨询其他注入服务以获取更多信息时。

   public void AddExternalAccounts(Guid externalId, List<ExternalAccountDto> accounts)
    {
        var entities = _mapper.Map<List<ExternalAccountDto>, List<Account>>(accounts, 
            options => options.AfterMap((source, destination) =>
                {
                    destination.ForEach(account => account.ExternalId = externalId);
                }));
    }
Run Code Online (Sandbox Code Playgroud)

关于类的另外两点AccountProfile
您可以在创建映射配置文件时检查映射配置文件是否正确。这将使您在运行时避免遇到此问题而头痛。您会立即知道配置有问题。

 var config = new MapperConfiguration(cfg =>
        {
            cfg.AddProfile<MappingProfile>();
            cfg.AllowNullDestinationValues = false;
        });

        // Check that there are no issues with this configuration, which we'll encounter eventually at runtime.
        config.AssertConfigurationIsValid();

        _mapper = config.CreateMapper();
Run Code Online (Sandbox Code Playgroud)

这也通知我需要一个班级成员.Ignore()ExternalIdAccount

 CreateMap<ExternalAccountDto, Account>().ForMember(d => d.ExternalId, a => a.Ignore());
Run Code Online (Sandbox Code Playgroud)