Как составить карту рецептов с ингредиентами с помощью AutoMapper - PullRequest
0 голосов
/ 18 октября 2018

У меня есть следующие классы RecipeModel, IngredientModel и RecipePartModel, которые представляют классы DTO для внешнего пользователя:

public class RecipeModel
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string ImageUrl { get; set; }
    public string Description { get; set; }
    public IEnumerable<RecipePartModel> RecipeParts { get; set; }
}

public class IngredientModel
{
    public Guid Id { get; set; }
    public string Name { get; set; }
}

public class RecipePartModel
{
    public Guid Id { get; set; }
    public IngredientModel Ingredient { get; set; }
    public string Unit { get; set; }
    public decimal Quantity { get; set; }
}

Вот мои классы сущностей:

public class Recipe : BaseEntity
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key]
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string ImageUrl { get; set; }
    public string Description { get; set; }
    public virtual IEnumerable<RecipePart> RecipeParts { get; set; }
}

public class Ingredient : BaseEntity
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key]
    public Guid Id { get; set; }
    public string Name { get; set; }
    public int Amount { get; set; }
    public virtual IEnumerable<RecipePart> RecipeParts { get; set; }
}

public class RecipePart : BaseEntity
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key]
    public Guid Id { get; set; }
    public Ingredient Ingredient { get; set; }
    public Recipe Recipe { get; set; }
    public string Unit { get; set; }
    public decimal Quantity { get; set; }
}

Мой вопрос -Как я могу сопоставить рецепт с RecipeModel с помощью AutoMapper?Я пытался что-то вроде этого, но я предполагаю, что это плохо, потому что это просто объединить все RecipeParts для всей базы данных, я прав?

public class DomainProfile : Profile
{
    public DomainProfile()
    {
        CreateMap<Ingredient, IngredientModel>().ReverseMap();
        CreateMap<Recipe, RecipeModel>()
            .ForMember(x => x.RecipeParts, opt => opt.MapFrom(src => src.RecipeParts));
    }
}

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Чтобы ответить на ваш вопрос о том, как использовать AutoMapper для сопоставления типа другому типу, есть много способов сделать это.Документация находится здесь: http://docs.automapper.org/en/stable/Getting-started.html.

Я написал консольное приложение и заставил его работать как можно быстрее, насколько я знаю, используя ваш код.Когда я отлаживаю это и проверяю внутри recipeModel, он ссылается на список RecipePartModel с одной RecipePartModel.Внутри этой RecipePartModel он ссылается на IngredientModel.

    static void Main(string[] args)
    {
        var profile = new DomainProfile();

        Mapper.Initialize(cfg => cfg.AddProfile(profile));

        var recipe = new Recipe
        {
            RecipeParts = new List<RecipePart>
            {
                new RecipePart()
                {
                    Ingredient = new Ingredient()
                }
            }
        };

        var recipeModel = Mapper.Map<Recipe, RecipeModel>(recipe);

        Console.ReadKey();
    }

Чтобы ответить на ваше беспокойство по поводу получения всех рецептов из базы данных, если вы используете Entity Framework, это зависит от того, включена ли отложенная загрузка.Ленивая загрузка гарантирует, что при получении рецепта из базы данных части рецепта не будут загружены.Они будут загружены только при непосредственном доступе к части рецепта в потоке программы.Ленивая загрузка включена по умолчанию, так что это поведение по умолчанию.Если вы выключите его, вы включите готовую загрузку, которая загружает все части рецепта и, в свою очередь, их ингредиент.

Это может помочь: http://www.entityframeworktutorial.net/lazyloading-in-entity-framework.aspx.

0 голосов
/ 18 октября 2018

В этом отображении нет ничего плохого.На самом деле вам даже не нужен вызов ForMember, так как это соглашение по умолчанию.Сопоставление просто преобразует каждый элемент в дочерней коллекции сущности в соответствующий объект модели.

Конечно, эффективная загрузка ваших сущностей - это другой вопрос.Если вы загружаете большое количество сущностей Recipe и лениво загружаете коллекции RecipeParts для каждой, у вас будет серьезная проблема «SELECT N + 1».Но это не вина AutoMapper.

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