简体   繁体   English

具有多对多和 IncludeMembers 的 Automapper

[英]Automapper with many to many and IncludeMembers

Below is my Class下面是我的班级

  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>();

}

Auto mapper configuration based on this link Automapper many to many基于此链接的自动映射器配置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())
            ;

I need to map Account to SubAccount1DTO and Reversemap.我需要将 Account 映射到 SubAccount1DTO 和 Reversemap。 Here SubAccount1DTO has list of customersdto But when i included below line这里 SubAccount1DTO 有 customerdto 列表但是当我包含在下面的行

.ForMember(d => d.Customers, opt => opt.MapFrom(s => s.AccountAndCustomers)) .ForMember(d => d.Customers, opt => opt.MapFrom(s => s.AccountAndCustomers))

i am getting below error .. Please suggest我收到以下错误..请提出建议

One or more errors occurred.发生了一个或多个错误。 (The following member on Application.DTOs.Accounts.SubAccount1DTO cannot be mapped: Customers Add a custom mapping expression, ignore, add a custom resolver, or modify the destination type Application.DTOs.Accounts.SubAccount1DTO. Context: Mapping to member Customers from Domain.Entities.Accounts.Account to Application.DTOs.Accounts.SubAccount1DTO (Application.DTOs.Accounts.SubAccount1DTO 上的以下成员无法映射:Customers 添加自定义映射表达式、忽略、添加自定义解析器或修改目标类型 Application.DTOs.Accounts.SubAccount1DTO。上下文:映射到成员客户来自Domain.Entities.Accounts.Account 到 Application.DTOs.Accounts.SubAccount1DTO

The following mapping下面的映射

.ForMember(d => d.Customers, opt => opt.MapFrom(s => s.AccountAndCustomers))

maps source property of type ICollection<AccountCustomer> to destination property of type IReadOnlyList<CustomerDTO> .ICollection<AccountCustomer>类型的源属性映射到IReadOnlyList<CustomerDTO>类型的目标属性。

AutoMapper allows that, but requires you to create map for collection element types - in this specific case, AccountCustomer to CustomerDTO (in the linked post there is similar mapping from BookCategory to CategoryDto ). AutoMapper 允许这样做,但要求您为集合元素类型创建映射 - 在这种特定情况下,是AccountCustomerCustomerDTO (在链接的帖子中有类似的从BookCategoryCategoryDto映射)。

Hence the minimum you need here is adding something like this to the mapper configuration:因此,您至少需要在映射器配置中添加如下内容:

CreateMap<AccountCustomer, CustomerDTO>()
    .IncludeMembers(s => s.Customer);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM