Automapper не отображает зависимый объект с помощью запроса get - PullRequest
0 голосов
/ 29 января 2020

Когда я вызываю переменную объектной модели, прямо из базы данных, я получаю все необходимые данные о зависимом объекте: MenuItem.

Когда я использую автопереработчик, он отображает сопоставленный объект MenuItem как ноль. Автоматическое сопоставление для getAll и getAllById работает.

Основной объект: ItemCategory DependentEntity: 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 для возврата ItemCategory со связанным menuItems:

 [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");
            }
        }

1 Ответ

0 голосов
/ 29 января 2020

Имена свойств должны быть одинаковыми, но вы просто пропустили 's' для модели ItemCategory

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 ().

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