Automapper不使用get请求映射依赖实体

问题描述 投票:0回答:1

当我直接从数据库中调用对象模型变量时,我收到了有关从属实体MenuItem的所有所需数据。

当我使用自动映射器时,它将映射的MenuItem对象显示为null。getAll和getAllById的自动映射有效。

原理实体:ItemCategoryDependentEntity:MenuItem

请帮助。

映射配置文件:

 public class MappingProfile: Profile
    {
        public MappingProfile()
        {
            CreateMap<ItemCategory, ItemCategoryDto>();
            CreateMap<ItemType, ItemTypeDto>();
            CreateMap<ItemStatus, ItemStatusDto>();

            CreateMap<MenuItem, MenuItemDto>();
            //CreateMap<ItemCategory, ItemCategoryDto>();
            //CreateMap<ItemType, ItemTypeDto>();
            //CreateMap<ItemStatus, ItemStatusDto>();

        }
    }

ItemCategory模型类:

public partial class ItemCategory
    {
        public ItemCategory()
        {
            MenuItem = new HashSet<MenuItem>();
        }

        public Guid Id { get; set; }
        public string Description { get; set; }

        public virtual ICollection<MenuItem> MenuItem { get; set; }
    }

MenuItem模型类:

public partial class MenuItem
    {
        public MenuItem()
        {
            Menu = new HashSet<Menu>();
            MenuItemAllergy = new HashSet<MenuItemAllergy>();
            MenuItemIngredient = new HashSet<MenuItemIngredient>();
            MenuItemPrice = new HashSet<MenuItemPrice>();
            MenuItemSpecial = new HashSet<MenuItemSpecial>();
            OrderMenuItem = new HashSet<OrderMenuItem>();
        }

        public Guid Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public Guid ItemCategoryId { get; set; }
        public Guid ItemTypeId { get; set; }
        public Guid ItemStatusId { get; set; }

        public virtual ItemCategory ItemCategory { get; set; }
        public virtual ItemStatus ItemStatus { get; set; }
        public virtual ItemType ItemType { get; set; }
        public virtual ICollection<Menu> Menu { get; set; }
        public virtual ICollection<MenuItemAllergy> MenuItemAllergy { get; set; }
        public virtual ICollection<MenuItemIngredient> MenuItemIngredient { get; set; }
        public virtual ICollection<MenuItemPrice> MenuItemPrice { get; set; }
        public virtual ICollection<MenuItemSpecial> MenuItemSpecial { get; set; }
        public virtual ICollection<OrderMenuItem> OrderMenuItem { get; set; }
    }

ItemCategoryDTO:

public class ItemCategoryDto
    {

        public Guid Id { get; set; }
        public string Description { get; set; }

        public IEnumerable<MenuItemDto> MenuItems { get; set; }
    }

MenuItemDTO:

public class MenuItemDto
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }

    }

ItemCategory接口:

public interface IItemCategory: IRepositoryBase<ItemCategory>
    {
        IEnumerable<ItemCategory> GetAllItemCategories();
        ItemCategory GetItemCategoryById(Guid categoryId);
        ItemCategory GetItemCategoryWithDetails(Guid categoryId);
    }

ItemCategory存储库:

public class ItemCategoryRepository: RepositoryBase<ItemCategory>, IItemCategory
    {
        public ItemCategoryRepository(eWaiterTestContext repositoryContext)
            : base(repositoryContext)
        {
        }

        public IEnumerable<ItemCategory> GetAllItemCategories()
        {
            return FindAll()
                .OrderBy(ic => ic.Description)
                .ToList();
        }

        //Can Add Find By description same way
        public ItemCategory GetItemCategoryById(Guid categoryId)
        {
            return FindByCondition(x => x.Id.Equals(categoryId))
                .FirstOrDefault();
        }

        public ItemCategory GetItemCategoryWithDetails(Guid categoryId)
        {
            return FindByCondition(x => x.Id.Equals(categoryId))
                    .Include(z=>z.MenuItem)
                    .FirstOrDefault();
        }
    }

ItemCategory控制器以返回带有相关menuItems的ItemCategory:

 [HttpGet("{id}/menuItem")]
        public IActionResult GetItemCategoryWithDetails(Guid id)
        {
            try
            {
                var category = _repository.ItemCategory.GetItemCategoryWithDetails(id);

                if (category == null)
                {
                    _logger.LogError($"Category with id: {id}, hasn't been found in db.");
                    return NotFound();
                }
                else
                {
                    _logger.LogInfo($"Returned owner with details for id: {id}");

                    var result = _mapper.Map<ItemCategoryDto>(category);
                    return Ok(result);
                }
            }
            catch (Exception ex)
            {
                _logger.LogError($"Something went wrong inside GetItemCategoryWithDetails action: 
                 straight from the database{ex.Message}");
                return StatusCode(500, "Internal server error");
            }
        }
asp.net-core automapper repository-pattern
1个回答
0
投票

属性的名称必须相同,但对于ItemCategory模型,您只是跳过了's'

ItemCategory模型类:

public partial class ItemCategory {
    public virtual ICollection<MenuItem> MenuItem { get; set; }
}

ItemCategoryDto模型类:

public partial class ItemCategoryDto {
    public virtual ICollection<MenuItem> MenuItems { get; set; }
}

或者您也可以像这样设置AutoMapper:)

public class CategoryMapper: Profile
{
    public CategoryMapper()
    {
        CreateMap<ItemCategory, ItemCategoryDto>()
            .ForMember(x => x.MenuItems, x => x.MapFrom(src => src.MenuItem));
    }
}

并将其注入Startup.cs

var mappingConfig = new MapperConfiguration(mc =>
{
 mc.AddProfile(new GemlemMapper());
 });
IMapper mapper = mappingConfig.CreateMapper();
services.AddSingleton(mapper);

希望它会有所帮助,还要知道,您需要使用的所有属性都应该包含在Include()中。

© www.soinside.com 2019 - 2024. All rights reserved.