【问题标题】:Why repository "Get" and "GetAsync" methods throw EntityNotFoundException instead of returning null if the entity doesn't exists?如果实体不存在,为什么存储库“Get”和“GetAsync”方法会抛出 EntityNotFoundException 而不是返回 null?
【发布时间】:2019-05-09 20:46:02
【问题描述】:

使用 module-zero-core-template(完全更新),我最近在用户要求删除帐户时遇到问题(这是第一次),我的代码中的很多地方都在获取“用户”实体使用 Repository.Get(TPrimaryKey id) 或 Repository.GetAsync(TPrimaryKey id):

var user = _userRepository.Get(model.UserId);

直到现在我还没有意识到当实体不存在时它会引发异常,但我必须将所有调用替换为(或等效的异步):

var user = _userRepository.FirstOrDefault(u => u.Id == model.UserId);

我的代码不是用来处理这种异常的,而只是返回一个空值。

我的问题是:

  • 为什么返回异常而不是空值?
  • 有没有办法修改这种行为?

提前感谢。

【问题讨论】:

  • 该存储库来自哪里?你能提供那个代码吗?
  • 它来自那里:private readonly IRepository _userRepository;
  • 好的,但是实现在哪里?
  • 来自Abp.Domain.Repositories,公共接口IRepository : IRepository, ITransientDependency where TEntity : class, IEntity
  • 你想要面向 null 的编程,但这是一个固执己见的框架,Get() 的行为与 Single() 一样。因此,如果您想编码容错,请在使用 GET() 之前使用 ANY() 检查记录是否存在。

标签: asp.net-core aspnetboilerplate


【解决方案1】:

这是因为实现就像that 一样。

如果你想找到一个实体而不抛出异常,你必须使用FirstOrDefault(TPrimaryKey id)function

编辑(解释):

就像说Single(x => x.Id == 1)。你期待一个结果,如果没有,它会抛出一个异常。这就是我们有SingleOrDefault(expr)SingleOrDefault(expr)FirstOrDefault(expr)First(expr) 的原因。涉及同一校长

【讨论】:

  • 谢谢,但我完全理解它为什么会抛出异常,我想知道为什么首选返回 null,以及是否有一种简单的方法可以重新实现它以返回 null,比如“FirstOrDefault”方法
  • 就像说Single(x => x.Id == 1)。你期待一个结果,如果没有,它会抛出一个异常。这就是我们有SingleOrDefault(expr)Single(expr)FirstOrDefault(expr)First(expr) 的原因。涉及同一位校长。老实说,我认为您不知道这一点,因为您无法解释您的存储库实现的来源。
猜你喜欢
  • 2019-03-03
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 2021-09-08
  • 1970-01-01
  • 2012-03-04
相关资源
最近更新 更多