首页 > 解决方案 > 更新条目时出错

问题描述

我正在为我的控制器添加功能而苦苦挣扎。添加新项目时,收到如下错误:“更新条目时发生错误。有关详细信息,请参阅内部异常。” 我对其进行了调试,并了解 ProductDetailIs 为空,这就是问题所在。但是,无法弄清楚如何修复问题。

这是DTO模型:

public class WishlistItemDto
    {
        public int Id { get; set; }

        public string CustomerId { get; set; }

        public ProductDetailsDtoWithPrimaryImage ProductDetails { get; set; }

        public int Quantity { get; set; }
    }

public class WishListItemCreationDto
    {
        public string CustomerId { get; set; }

        public int ProductDetailId { get; set; }

        public int Quantity { get; set; }
    }

控制器:

[HttpPost]
public async Task<IActionResult> Add(WishListItemCreationDto wishListItemDto)
{
    var itemAdd = _mapper.Map<WishlistItemDto>(wishListItemDto);
    var itemCreated = await _wishListItemService.AddAsync(itemAdd);

    return CreatedAtAction(nameof(GetId), new { id = itemCreated.Id }, wishListItemDto);
}

服务:

public async Task<WishlistItemDto> AddAsync(WishlistItemDto item)
{
    var entity = _mapper.Map<WishlistItem>(item);
    await _wishListItemRepository.AddAsync(entity);

    return _mapper.Map<WishlistItemDto>(entity);
}

存储库:

public async Task<WishlistItem> AddAsync(WishlistItem item)
{
    await _context.Set<WishlistItem>().AddAsync(item);
    await _context.SaveChangesAsync();

    return item;
}

标签: entity-frameworkasp.net-coreasp.net-web-apientity-framework-core

解决方案


这一行在这里:

var itemAdd = _mapper.Map<WishlistItemDto>(wishListItemDto);

您的“wishListItemDto”作为仅包含 ProductDetailsId 的“WishListItemCreationDto”传入。Automapper 将无法知道如何将其转换为ProductDetailsDtoWithPrimaryImage.

通常对于像这样传递引用 ID 的事情,您将通过填充 FK 或加载引用的实体来组成您的实体。您现有的服务和存储库模式将使您的最终解决方案复杂化。从您的示例中我可以看到,我将考虑创建一个AddAsync接受以下内容的方法WishListItemCreationDto

public async Task<WishlistItemCreationDto> AddAsync(WishlistItemCreationDto item)
{
    var entity = _mapper.Map<WishlistItem>(item);
    var productDetails = _productDetailsRepository.GetById(item.ProductDetailsId);
    entity.ProductDetails = productDetails;
    await _wishListItemRepository.AddAsync(entity);

    return _mapper.Map<WishlistItemDto>(entity);
}

如果没有增加服务和存储库的抽象复杂性,添加操作可以简单得多:

[HttpPost]
public async Task<IActionResult> Add(WishListItemCreationDto wishListItemDto)
{
    // or better, use an injected dependency to the Context...
    // TODO: add applicable exception handling.
    using(var context = new AppDbContext())
    {
        var item = _mapper.Map<WishlistItem>(wishListItemDto);
        var productDetails = context.ProductDetails.Single(x => x.ProductDetailsId == wishListItemDto.ProductDetailsId);
        item.ProductDetails = productDetails;
        context.SaveChanges();

        return CreatedAtAction(nameof(GetId), new { id = itemCreated.Id }, wishListItemDto);
    }
}

推荐阅读