c# - 具有多对多和 IncludeMembers 的自动映射器

标签 c# automapper fluent

下面是我的类(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>();

}

基于此链接的自动映射器配置 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);

关于c# - 具有多对多和 IncludeMembers 的自动映射器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63717024/

相关文章:

c# - 在 .NET Core 3.0 中加载 exe 时出现错误的 IL 格式

c# - 将动态标签文本导出到 Excel

automapper - 如何使自动映射器不区分大小写?

php - 拉维尔 4 : Adding where clause to a join condition

Java 链式泛化

c# - 我应该使用哪个 Fluent WCF 框架(如果有)?

C# System.NullReferenceException 错误谷歌日历

c# - 在 visual studio 中删除当前文件的快捷方式

c# - 使用 AutoMapper 映射分组集合

c# - Automapper 多对多 stackoverflowexception