У меня проблема при совместном использовании AutoMapper и EF Core для отображения свойств навигации из модели в DTO. Мои классы EF:
public class Meal
{
public DateTime Day { get; set; }
public MealType MealType { get; set; }
public int MealId { get; set; }
}
public class MealType
{
public string Name { get; set; }
public int MealTypeId { get; set; }
}
И соответствующие классы DTO:
public class ExistingMealDto
{
public DateTime Day { get; set; }
public ExistingMealTypeDto MealType { get; set; }
public int MealId { get; set; }
public string MealTypeName { get; set; }
}
public class ExistingMealTypeDto
{
public string Name { get; set; }
public int MealTypeId { get; set; }
}
Это мое отображение AutoMapper:
config.CreateMap<DataLayer.EfClasses.MealType, ExistingMealTypeDto>();
config.CreateMap<DataLayer.EfClasses.Meal, ExistingMealDto>()
.ForMember(x => x.MealType, x => x.MapFrom(x=>x.MealType))
.ForMember(x => x.MealTypeName, x => x.MapFrom(y => y.MealType.Name));
Я загружаю данные в методе generi c, который выглядит следующим образом:
public IEnumerable<TDtoOut> GetAllAsDto<TIn, TDtoOut>()
where TIn : class
{
var allEntities = DbContext.Set<TIn>();
return Mapper.Map<IEnumerable<TDtoOut>>(allEntities);
}
При вызове этого кода все экземпляры Meal
загружаются из базы данных, а MealId
и Day
заполняются правильно. Однако MealType
равно null
и, следовательно, ExistingMealDto.MealType
равно null
. Я могу обойти эту проблему, явно вызвав DbContext.MealTypes.ToList()
, но так как метод должен быть обобщенным c для TIn
, это не производственное решение.
Как я могу решить эту проблему? Спасибо!