Automapper не работает в Reverse Mapping in. net core - PullRequest
0 голосов
/ 22 января 2020

Я использую. Net ядро ​​с Entity Framework. Ниже приведен мой код

Просмотр модели

public class EmployeeVm
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string ContactNo { get; set; }
        public string Email { get; set; }
        public DateTime JoiningDate { get; set; }
        public int BranchId { get; set; }
        public int DepartmentId { get; set; }
    }

POCO Class

public class employee
    {
        [Key]
        public int id { get; set; } 
        public string name { get; set; }
        public string contact_no { get; set; }
        public string email { get; set; }
        public DateTime joining_date { get; set; }
        public int branch_id { get; set; }
        public int department_id { get; set; }      
    }

Конфигурация Automapper из класса запуска

public void ConfigureServices(IServiceCollection services)
        {
            var mappingConfig = new MapperConfiguration(mc =>
            {
                mc.AddProfile(new MappingProfile());
            });

            IMapper mapper = mappingConfig.CreateMapper();
            services.AddSingleton(mapper);
        }

Класс профиля отображения

public class MappingProfile : Profile
    {
        public MappingProfile()
        {
            CreateMap<employee, EmployeeVm>();
            CreateMap<EmployeeVm, employee>();
        }
    }

Когда я пытаюсь сопоставить свойства View Model со свойствами класса POCO, используя приведенный ниже код, все работает нормально.

//Here I am using constructor injection
private readonly IMapper _mapper;
public EmployeeBl(IMapper mapper)
{
    _mapper = mapper;
}

_mapper.Map<employee>(employeeVm)

Но когда я пытаюсь отобразить класс POCO ( employee ) свойств для свойств модуля View ( EmployeeVm ), тогда некоторые свойства не отображаются, поскольку они содержат подчеркивание в классе POCO

Вот ответ почтальона

{
    "id": 4,
    "name": "test",
    "contactNo": null,
    "email": "test@gmail.com",
    "joiningDate": "0001-01-01T00:00:00",
    "branchId": 0,
    "departmentId": 0,
}

От ответа выше я ожидаю сопоставить свойства contactNo, joininingDate, branchId и DepartmentId с соответствующим значением.

Ответы [ 3 ]

1 голос
/ 22 января 2020

https://docs.automapper.org/en/stable/Configuration.html#naming -условий

Вы можете установить соглашения об именах источника и назначения

var configuration = new MapperConfiguration(cfg => {
  cfg.SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();
  cfg.DestinationMemberNamingConvention = new PascalCaseNamingConvention();
});

Это сопоставит следующие свойства друг с другом: property_name -> PropertyName

Вы также можете установить это на уровне профиля

public class OrganizationProfile : Profile
{
  public OrganizationProfile()
  {
    SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();
    DestinationMemberNamingConvention = new PascalCaseNamingConvention();
    //Put your CreateMap... Etc.. here
  }
}
1 голос
/ 22 января 2020

AutoMapper не сопоставляет snake_case с PascalCase автоматически. Вы должны настроить соглашения об именах, как описано здесь: https://docs.automapper.org/en/v9.0.0/Configuration.html#naming -условий

Или сопоставить свойства по одному за раз.

Тем не менее, предполагая, что ваш "класс POCO" "это то, что вам нужно хранить в базе данных с использованием некоторой среды персистентности, лучше подойти к настройке вашего инструмента персистенции со знанием имен столбцов snake_cased в базе данных и позволить вашим C# объектам соответствовать C# соглашениям об именах , который диктует, что имена свойств должны быть PascalCase. Это означает, что вы можете присваивать имена свойств одинаковым образом и разрешать настройку AutoMapper по умолчанию для сопоставления ваших объектов.

0 голосов
/ 22 января 2020

Вы также можете отобразить реквизит, который имеет другое имя, кроме конфигурации

Mapper.CreateMap<employee, EmployeeVm>()
    .ForMember(dest => dest.JoiningDate, opt => opt.MapFrom(src => joining_date ));
...