Лучший способ проверить заданное значение на уникальном в базе данных с. NET Core - PullRequest
0 голосов
/ 30 марта 2020

У меня есть следующие действия контроллера:

public async Task<IActionResult> Create([FromForm]LanguageViewModel viewModel)
{
    if (!ModelState.IsValid)
    {
        return View(viewModel);
    }

    var newLanguage = new Language()
    {
        Sort = viewModel.Sort,
        LangCode = viewModel.Code,
        LangName = viewModel.Name
    };

    await _languageRepository.SaveAsync(newLanguage);

    return RedirectToAction("Index");
}

И следующие viewModel:

public class LanguageViewModel
{
    public int Sort { get; set; }
    [Required(ErrorMessage = "Language code is required")]
    public string Code { get; set; }
    [Required(ErrorMessage = "Language name is required")]
    public string Name { get; set; }
}

Обратите внимание, что LanguageViewModel не является моим доменом (Entity Framework) объектом , Для карты в моей базе данных у меня есть еще один:

public class Language
{
    public int LanguageId { get; set; }

    public int Sort { get; set; }

    public string LangName { get; set; }

    public string LangCode { get; set; }
}

Итак, я работаю с ASP. NET MVC Core 3.1, и мне нужно проверить, если Language с данным кодом уже существует или нет. Если он существует, я хотел бы показать ошибку проверки об этом. Вы можете сказать, что я могу решить это как:

public async Task<IActionResult> Create([FromForm] LanguageViewModel viewModel)
{
    if (!ModelState.IsValid)
    {
        return View(viewModel);
    }

    var lang = await _languageRepository.All.FirstOrDefaultAsync(x =>
        x.LangCode.ToUpper() == viewModel.Code.ToUpper());

    if (lang != null)
    {
        ModelState.TryAddModelError("Code", $"The language with code {viewModel.Code} already exists");
    }

    if (!ModelState.IsValid)
    {
        return View(viewModel);
    }

    var newLanguage = new Language()
    {
        Sort = viewModel.Sort,
        LangCode = viewModel.Code,
        LangName = viewModel.Name
    };

    await _languageRepository.SaveAsync(newLanguage);

    return RedirectToAction("Index");
}

Хорошо. оно работает. Но это некрасиво :( Может есть лучшее решение?

1 Ответ

0 голосов
/ 30 марта 2020

Возможно, это было бы немного чище.

if (_languageRepository.Any(o => o.LangCode.Equals(txnId, StringComparison.InvariantCultureIgnoreCase))) 
{
    ModelState.TryAddModelError("Code", $"The language with code {viewModel.Code} already exists");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...