问题描述
下面是我的班级
public class Account
{
public int Id { get; set; }
public string AccountNumber { get; set; } = null!;
..other fields
public SubAccount1 SubAccount1 { get; set; } = null!;
public SubAccount2 SubAccount2 { get; set; } = null!;
public ICollection<AccountCustomer> AccountAndCustomers { get; set; } = new List<AccountCustomer>(); ///Many to many mapping
}
public class AccountCustomer
{
public int AccountId { get; set; }
public Account Account { get; set; } = null!;
public int CustomerId { get; set; }
public Customer Customer { get; set; } = null!;
...other fields
}
public class SubAccount1
{
public int AccountId { get; set; }
public Account Account { get; set; } = null!;
public string Subfield1 { get; set; } = null!;
..other fields
}
public class SubAccount2
{
public int AccountId { get; set; }
public Account Account { get; set; } = null!;
public string Subfield2 { get; set; } = null!;
..other fields
}
public class SubAccount1DTO
{
public int AccountId { get; set; }
public string AccountNumber { get; set; } = null!;
public string Subfield1 { get; set; } = null!;
public IReadOnlyList<CustomerDTO> Customers { get; set; } = new List<CustomerDTO>();
}
public class CustomerDTO
{
public int Id { get; set; }
public string CustomerNo { get; set; } = null!;
public string FirstName { get; set; } = null!;
..other fillds
}
public class Customer
{
public int Id { get; set; }
public string? CustomerNo { get; set; } = null!;
....other filds
public ICollection<AccountCustomer> AccountAndCustomers { get; set; } = new List<AccountCustomer>();
}
基于此链接Automapper many to many的自动映射器配置
CreateMap<Customer,CustomerDTO>().ReverseMap();
CreateMap<Account,SubAccount1DTO>()
.IncludeMembers(s => s.SubAccount1)
.ForMember(d => d.Customers,opt => opt.MapFrom(s => s.AccountAndCustomers)) ///After include Customers related am getting error
.ReverseMap()
.AfterMap((s,d) =>
{
foreach (var accountCustomer in d.AccountAndCustomers)
accountCustomer.AccountId = s.AccountId ;
});
CreateMap<SubAccount1,SubAccount1DTO>(MemberList.None)
.ForMember(dest => dest.Id,opt => opt.Ignore())
.ForMember(dest => dest.AccountNumber,opt => opt.Ignore())
.ReverseMap();
CreateMap<Customer,AccountCustomer>() ----i dnt no whether this to included
.ForMember(dest => dest.CustomerId,opt => opt.MapFrom(src => src.Id))
.ForMember(dest => dest.Customer,opt => opt.MapFrom(src => src))
.ForMember(dest => dest.AccountId,opt => opt.Ignore())
.ForMember(dest => dest.Account,opt => opt.Ignore())
;
我需要将Account映射到SubAccount1DTO和Reversemap。这里SubAccount1DTO拥有customersdto的客户列表,但是当我在下面的行中添加
.ForMember(d => d.Customers,opt => opt.MapFrom(s => s.AccountAndCustomers))
我遇到以下错误。.请提出
发生一个或多个错误。 (无法映射Application.DTOs.Accounts.SubAccount1DTO上的以下成员: 顾客 添加一个自定义映射表达式,忽略,添加一个自定义解析器,或修改目标类型Application.DTOs.Accounts.SubAccount1DTO。 内容: 从Domain.Entities.Accounts.Account到Application.DTOs.Accounts.SubAccount1DTO映射到成员客户
解决方法
以下映射
.ForMember(d => d.Customers,opt => opt.MapFrom(s => s.AccountAndCustomers))
将类型ICollection<AccountCustomer>
的源属性映射到类型IReadOnlyList<CustomerDTO>
的目标属性。
AutoMapper允许这样做,但需要您为集合元素类型创建映射-在这种特定情况下,从AccountCustomer
到CustomerDTO
(在链接的帖子中,从BookCategory
到CategoryDto
。
因此,您需要的最低要求是在映射器配置中添加以下内容:
CreateMap<AccountCustomer,CustomerDTO>()
.IncludeMembers(s => s.Customer);