具有很多对很多和IncludeMembers的自动映射器

问题描述

下面是我的班级

  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允许这样做,但需要您为集合元素类型创建映射-在这种特定情况下,从AccountCustomerCustomerDTO(在链接的帖子中,从BookCategoryCategoryDto

因此,您需要的最低要求是在映射器配置中添加以下内容:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...