entity-framework - 更新条目时出错
问题描述
我正在为我的控制器添加功能而苦苦挣扎。添加新项目时,收到如下错误:“更新条目时发生错误。有关详细信息,请参阅内部异常。” 我对其进行了调试,并了解 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;
}
解决方案
这一行在这里:
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);
}
}
推荐阅读
- windows - React Native Debugger 无法在我的 Windows 10 上运行
- javascript - 在选项卡/窗口关闭之前发出 HTTP 请求的可靠方法
- javascript - Heroku 应用程序崩溃 - 从“react-native”导入 {AppRegistry};- SyntaxError:意外的令牌导入
- c++ - c++ login 即使登录错误也会执行主代码
- python - crontab 没有运行 shell 脚本
- swift - 如何在 Swift 4+ 中将八进制转换为二进制
- python - 如何在 RPy 中使用 smooth.spline 的 lambda 参数而不用 Python 将其解释为 lambda
- python - 启用处理程序类方法以产生实例属性
- javascript - 如何循环通过带有 ID 的 javascript 函数?
- excel - 基于标准 Excel 对非相邻列求和