Должен ли я проверять, существует ли пользователь перед его удалением?

Я много раз видел такой код:

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

return new JsonResult(result);

Но я хотел бы узнать ваше мнение, хорошо ли это или лучше сделать оператор if, в котором вы проверяете, действительно ли существует пользователь или нет?


person mbrc    schedule 19.04.2018    source источник


Ответы (3)


Это зависит от реализации _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);
    }
person Darjan Bogdan    schedule 19.04.2018

Ответ зависит от контекста, в котором выполняется удаление:

  • Если ваша программа находится в активном взаимодействии с конечным пользователем, который запрашивает удаление пользователя, то знание того, что пользователь, которого он хотел удалить, не существует, является ценной информацией, поэтому вы должны сообщить об этом.
  • Если ваша программа выполняет какую-то пакетную очистку, и ситуация, когда пользователь может существовать или не существовать, в порядке, вы можете пропустить проверку.

Обратите внимание, ваш код все равно будет проверять user на null, чтобы избежать ArgumentNullException при вызове DeleteAsync. Это всего лишь деталь реализации: реальное решение, которое вам нужно принять, это то, что с этим делать.

person Sergey Kalinichenko    schedule 19.04.2018

Примечание. Этот ответ предполагает, что вы используете встроенный 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);
person Camilo Terevinto    schedule 19.04.2018
comment
@Nyerguds Зачем вам ловить исключение, которое вам совершенно не нужно? Исключения стоят дорого - person Camilo Terevinto; 19.04.2018
comment
Не совсем. По сравнению с вызовами базы данных эти расходы совершенно незначительны. - person Nyerguds; 19.04.2018