У меня работает большинство карт автомапперов, но я столкнулся с проблемой при попытке перевести перечисление из значения в строку, когда она является частью списка дочерних объектов. У меня есть преобразователь перечисления в строку, работающий на верхнем уровне, но кажется, что когда я конвертирую из RecipeStep в RecipeStepResource, он не использует карту, определенную для Ingredient в IngredientResource, и поэтому преобразование из перечисления в строку не вызывается.
Я осмотрелся, но, похоже, не могу найти аналогичный пример для работы, и у меня проблемы с расшифровкой справки автомаппера по этому поводу, в которой говорится, что он должен автоматически выбирать определенную карту, чего нет. кажется, не уверен, что это потому, что элементы-ингредиенты являются частью списка. Основные фрагменты кода ниже, любая помощь приветствуется.
Модель:
public class RecipeStep
{
[Required]
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public string Description { get; set; }
public IList<Ingredient> Ingredients { get; set; }
public Timer Timer { get; set; }
public int RecipeID { get; set; }
[JsonIgnore]
[IgnoreDataMember]
[ForeignKey("RecipeID")]
public Recipe Recipe { get; set; }
}
public class Ingredient
{
[Required]
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
[Required]
[StringLength(50)]
public string Name { get; set; }
[Required]
public ETypeOfIngredient Type { get; set; }
[Required]
public double Amount { get; set; }
[Required]
public EUnitOfMeasure Unit { get; set; }
public int RecipeStepID { get; set; }
[JsonIgnore]
[IgnoreDataMember]
[ForeignKey("RecipeStepID")]
public RecipeStep RecipeStep { get; set; }
}
Ресурсы:
public class RecipeStepResource
{
public int ID { get; set; }
public string Description { get; set; }
public List<IngredientResource> Ingredients { get; set; }
public TimerResource Timer { get; set; }
}
public class IngredientResource
{
public int ID { get; set; }
public string Type { get; set; }
public string Name { get; set; }
public double Amount { get; set; }
public string Unit { get; set; }
public int RecipeStepID { get; set; }
}
Код сопоставления:
CreateMap<Ingredient, IngredientResource>()
.ForMember(src => src.Type,
opt => opt.MapFrom(src => src.Type.ToDescriptionString()))
.ForMember(src => src.Unit,
opt => opt.MapFrom(src => src.Unit.ToDescriptionString()));
CreateMap<Timer, TimerResource>();
CreateMap<RecipeStep, RecipeStepResource>()
.ForMember(dest => dest.Ingredients,
opt => opt.MapFrom(src => src.Ingredients))
.ForMember(src => src.Timer,
opt => opt.MapFrom(src => src.Timer));
Enum в код преобразования строки:
public static string ToDescriptionString<TEnum>(this TEnum @enum)
{
FieldInfo info = @enum.GetType().GetField(@enum.ToString());
var attributes = (DescriptionAttribute[])info.GetCustomAttributes(typeof(DescriptionAttribute), false);
return attributes?[0].Description ?? @enum.ToString();
}
Что я пробовал:
- Создание
Ingredient -> IngredientResource
карты - Создание
List<Ingredient> -> List<IngredientResource>
map - Добавление вызова AfterMap к
List<Ingredient> -> List<IngredientResource>
map для преобразования значения перечисления
Ничего из этого не сработало. Действительно изо всех сил пытаясь понять, почему AutoMapper не выбирает карту Ingredient to IngredientResource для свойства List объекта RecipeStep, я подумал, что это будет сделано автоматически.