我应该在删除用户之前检查其是否存在吗?

3

我经常看到这样的代码:

var user = await _userManager.FindByNameAsync(username);
var result = await _userManager.DeleteAsync(user);

return new JsonResult(result);

但我想知道你的意见,是这样做好呢,还是检查用户是否真的存在的if语句更好?

3个回答

2
这取决于_userManager.DeleteAsync的实现方式,因为您正在使用.Net Core Identity,DeleteAsync方法的实现将抛出ArgumentNullException
您可以在此处检查源代码此处,这是该方法的实现:
public virtual Task<IdentityResult> DeleteAsync(TUser user)
    {
        ThrowIfDisposed();
        if (user == null)
        {
            throw new ArgumentNullException(nameof(user));
        }

        return Store.DeleteAsync(user, CancellationToken);
    }

2
答案取决于删除操作的上下文环境:
- 如果您的程序正在与最终用户进行交互并请求用户删除,则了解所需删除的用户不存在是有价值的信息,因此应报告该信息。 - 如果您的程序执行某种批量清理,并且用户存在与否都可以接受,则可以跳过检查。
请注意,为避免在调用DeleteAsync时发生ArgumentNullException,您的代码仍然需要检查用户是否为空。这只是一个实现细节:您真正需要做出的决定是如何处理它。

-1

注意:此答案假定您正在使用内置的UserManager而不是自定义的。

正如您在源代码中所看到的:

public virtual Task<IdentityResult> DeleteAsync(TUser user)
{
    ThrowIfDisposed();
    if (user == null)
    {
        throw new ArgumentNullException(nameof(user));
    }

    return Store.DeleteAsync(user, CancellationToken);
}

null 作为参数传递给 DeleteAsync 将抛出 ArgumentNullException。所以,不,你提供的代码是不正确的。你需要先检查用户是否存在:
var user = await _userManager.FindByNameAsync(username);

if (user == null)
{
    return BadRequest("User not found");
}

var result = await _userManager.DeleteAsync(user);

return Json(result);

@Nyerguds,你为什么要捕获一个根本不需要被抛出的异常呢?异常是很耗费资源的。 - Camilo Terevinto
不是很多。与数据库调用相比,这个开销完全可以忽略不计。 - Nyerguds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接