Как заставить automapper отображать перечисления, которые являются частью списка дочерних объектов - PullRequest
0 голосов
/ 02 августа 2020

У меня работает большинство карт автомапперов, но я столкнулся с проблемой при попытке перевести перечисление из значения в строку, когда она является частью списка дочерних объектов. У меня есть преобразователь перечисления в строку, работающий на верхнем уровне, но кажется, что когда я конвертирую из 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, я подумал, что это будет сделано автоматически.

1 Ответ

1 голос
/ 04 августа 2020

Проблема сводилась к родительскому объекту, я неправильно сопоставил его с файлами модели и ресурсов, относящимися к RecipeStep, вместо RecipeStep -> RecipeStepResource. На самом деле хочу поблагодарить @Lucian за то, что помог мне и заставил go вернуться к основам, чтобы проработать понимание с более простой точки зрения и построить репрезентативную модель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...