更新条目时出错

Posted

技术标签:

【中文标题】更新条目时出错【英文标题】:An error occurred while updating the entries 【发布时间】:2021-09-04 15:42:38 【问题描述】:

我很难为我的控制器添加功能。添加新项目时,收到如下错误:“更新条目时发生错误。有关详细信息,请参阅内部异常。” 我对其进行了调试,并了解 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;

【问题讨论】:

您好@dotnetlooper,欢迎来到 Stack Overflow。第一步是创建一个 minimal 示例以隔离问题。在您的情况下,它将从图片中删除 _mapper_ 和 Repository (不确定它的目的是什么)。 似乎这个问题与实体框架关系不大 - 但在您简化问题之前我们不会知道。请参阅此链接以获取更多指导:***.com/help/how-to-ask 【参考方案1】:

这里的这一行:

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

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

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

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);
    

【讨论】:

以上是关于更新条目时出错的主要内容,如果未能解决你的问题,请参考以下文章

EF 更新条目时出错。有关详细信息,请参见内部异常。

(400) 错误请求和更新条目时发生错误

DbUpdateException 使用 LINQ to Database 更新记录时

Hibernate saveOrUpdate() 更新时创建新条目

php 重力Wiz //重力形式//使用条目填充表单(可选择在提交时更新条目)

CakePHP:hasOne 相关表在更新时保存多个条目