首页 > 解决方案 > AutoMapper 是否有任何自定义功能来解决映射问题?

问题描述

我正在尝试通过 AutoMapper 8.0.0 将一些实体映射到 DTO,将一些 DTO 映射到实体。

这是我将实体映射到 DTO 的 AutoMapper 定义。我能够通过下面的定义将实体映射到 DTO。

但是当我尝试通过反转 Recipe 和 RecipeDTO 将 DTO 映射到实体时,我无法映射。我有错误。

我应该如何定义自动映射器初始化才能实现这一点?

Mapper.Initialize(cfg =>
{
    cfg.CreateMap<Recipe, RecipeDTO>()
    .ForMember(dest => dest.Directions, opt => opt.MapFrom(src =>     
    src.Directions))
    .ForMember(dest => dest.Ingredients, opt => opt.MapFrom(src => 
    src.Ingredients))
    .ForMember(dest => dest.Categories, opt => opt.MapFrom(src => 
    src.Categories.Select(i => i.Name)));
});

这些是我的实体和 DTO

public class Recipe
{
    public override int Id { get; set; }

    public string Title { get; set; }

    public int DirectionId { get; set; }

    public virtual Direction Directions { get; set; }

    public override DateTime CreatedDate { get; set; }

    public override string CreatedBy { get; set; }

    public override DateTime? ModifiedDate { get; set; }

    public override string ModifiedBy { get; set; }

    public override bool IsDeleted { get; set; }

    public virtual ICollection<Category> Categories{get;set;}

    public virtual ICollection<Ingredient> Ingredients{get; set;}
}


public class Direction
{
    public override int Id { get; set; }

    public string Step { get; set; } 

    public int RecipeId { get; set; }
    public virtual Recipe Recipe { get; set; }

    public override DateTime CreatedDate { get; set; }

    public override string CreatedBy { get; set; }

    public override DateTime? ModifiedDate { get; set; }

    public override string ModifiedBy { get; set; }

    public override bool IsDeleted { get; set; }
}

public class Category
{
    public override int Id { get; set; }

    public string Name { get; set; } 

    public override DateTime CreatedDate { get; set; }

    public override string CreatedBy { get; set; }

    public override DateTime? ModifiedDate { get; set; }

    public override string ModifiedBy { get; set; }

    public override bool IsDeleted { get; set; }

    public virtual ICollection<Recipe> Recipes { get; set;}
}


public class Ingredient
{
    public override int Id { get; set; }

    public string Name { get; set; } 

    public override DateTime CreatedDate { get; set; }

    public override string CreatedBy { get; set; }

    public override DateTime? ModifiedDate { get; set; }

    public override string ModifiedBy { get; set; }

    public override bool IsDeleted { get; set; }

    public int AmountId { get; set; }
    public virtual Amount Amount { get; set; }

    public int RecipeId { get; set; }

    public virtual Recipe Recipe { get; set; }
}

public class Amount
{
    public override int Id { get; set; }

    public string Quantity { get; set; }

    public string Unit { get; set; }

    public override DateTime CreatedDate { get; set; }

    public override string CreatedBy { get; set; }

    public override DateTime? ModifiedDate { get; set; }

    public override string ModifiedBy { get; set; }

    public override bool IsDeleted { get; set; }

    public int IngredientId { get; set; }
    public virtual Ingredient Ingredient { get; set; }
}

public class RecipeDTO
{   
    public string Title { get; set; }

    public List<string> Categories { get; set; }

    public List<IngredientDTO> Ingredients { get; set; }

    public DirectionDTO Directions { get; set; }
} 

public class DirectionDTO
{
    public string Step { get; set; }
}

public class IngredientDTO
{ 
    public string Name { get; set; } 

    public AmountDTO Amount { get; set; }
}

public class AmountDTO
{
    public string Quantity { get; set; }

    public string Unit { get; set; }
}

标签: c#entity-frameworkasp.net-web-api2automapper

解决方案


推荐阅读