更新条目时出错
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 或加载引用的实体来组成您的实体。您现有的服务和存储库模式将使您的最终解决方案复杂化。从您的示例中我可以看到,我将考虑创建一个接受 WishListItemCreationDto
的 AddAsync
方法:
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);
【讨论】:
以上是关于更新条目时出错的主要内容,如果未能解决你的问题,请参考以下文章
DbUpdateException 使用 LINQ to Database 更新记录时
Hibernate saveOrUpdate() 更新时创建新条目