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

时间:2018-04-19 11:01:44

标签: c# asp.net-core asp.net-core-identity

我看过很多次这样的代码:

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

return new JsonResult(result);

但我想知道你的意见,如果这是好的,或者如果你在检查用户是否确实存在的陈述中做得更好?

3 个答案:

答案 0 :(得分:2)

这取决于_userManager.DeleteAsync实现,因为您使用的是.Net Core Identity,DeleteAsync方法的实现将抛出ArgumentNullException

您可以查看源代码here,这是方法的实现:

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

        return Store.DeleteAsync(user, CancellationToken);
    }

答案 1 :(得分:2)

答案取决于执行删除的上下文:

  • 如果您的程序与请求删除用户的最终用户进行了主动交互,那么知道他想删除的用户不存在是一个有价值的信息,因此您应该报告。
  • 如果您的程序执行某种批量清理,并且用户可能存在或不存在的情况很好,那么您可以跳过检查。

注意您的代码最终会user检查null,以避免在ArgumentNullException的调用中DeleteAsync。这只是一个实施细节:您需要做出的真正决定是如何处理它。

答案 2 :(得分:0)

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

正如您在source code中所看到的那样:

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