Что я возвращаю, если в базе данных нет такой строки? - PullRequest
0 голосов
/ 17 мая 2018

Я использую Entity Framework и у меня есть класс Repository, который выполняет всю выборку данных с помощью объекта dbContext.

В настоящее время есть метод с именем

public MovieDetails FindSingle(int? id)
{
    using (MovieContext dbContext = new MovieContext())
    {
        var newMovieDetails = dbContext.Movies.FirstOrDefault(x => x.MovieID == id);
        if (newMovieDetails == null)
        {
            throw new Exception();
        }
        var MappedDetails = new MovieDetails
        {
            MovieID = newMovieDetails.MovieID,
            MovieName = newMovieDetails.MovieName
        };
        return MappedDetails;
    }
}

В настоящее время, когда программа находит совпадение в базе данных, она преобразуется в Data Object Transfer-object. Когда я пытаюсь найти фильм, которого нет в базе данных, я получаю сообщение об ошибке. Есть ли способ, которым я мог бы вернуть тип, который говорит, что в базе данных нет такой строки? Или я должен просто вернуть пустой объект?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

вы можете использовать пакет: https://github.com/vkhorikov/CSharpFunctionalExtensions#make-nulls-explicit-with-the-maybe-type

И тогда вы можете установить в качестве возврата:

public Maybe<MovieDetails> FindSingle(int? id)

Так что, когда вы вызываете свою функцию, вы знаете, что она может быть нулевой.Что вы должны проверить: if (customerOrNothing.HasNoValue)

надеюсь, это поможет!

0 голосов
/ 17 мая 2018

Использование исключения для чего-то подобного является плохой идеей.
Исключения предназначены для исключительных вещей, а именно вещей, которые вы не можете контролировать в своем коде, таких как сетевые ошибки и нарушения разрешений ввода / вывода.
Этот видвещь - это то, что Эрик Липперт назвал бы досадным исключением :

Исключения являются результатом неудачных дизайнерских решений.Vexing исключения генерируются в совершенно не исключительных обстоятельствах, и поэтому должны быть пойманы и обрабатываться все время.

Классическим примером неприятного исключения является Int32.Parse, который выдает, если вы дадите ему строку, котораяне может быть проанализирован как целое числоНо 99% сценария использования этого метода - преобразование строк, вводимых пользователем, что может быть любой старой вещью, и, следовательно, это ни в коем случае не является исключительным случаем синтаксического анализа.Хуже того, у вызывающего абонента нет возможности заранее определить, является ли его аргумент плохим, без реализации всего метода самостоятельно, и в этом случае ему не нужно будет вызывать его в первую очередь.

Этонеудачное решение о дизайне было настолько досадным, что, конечно, вскоре после этого команда разработчиков фреймворков реализовала TryParse, что делает правильную вещь.

Если MappedDetails является ссылочным типом, лучше вернуть null, если этоне найден.
Если это тип значения, измените ваш метод на возвращение MovieDetails? и верните null.

Я бы также рекомендовал изменить имя вашего метода с FindSingle на GetMovieDetails или что-то в этом роде.
Таким образом, когда вы посмотрите на код через 6 месяцев и увидите что-то вроде этого:

....
var details = GetMovieDetails(id);
....

Вы можете мгновенно узнать, что на самом деле делает метод, в отличие от

....
var details = FindSingle(id);
....

, что в принципе вам ничего не говорит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...