处理存储库中未找到的对象

F11*_*F11 5 c# asp.net exception-handling asp.net-web-api

我有一个externall dll,其中定义了以下内容

namespace MoviesLibrary
{
    public class MovieDataSource
    {
        public MovieDataSource();

        public int Create(MovieData movie);
        public List<MovieData> GetAllData();
        public MovieData GetDataById(int id);
        public void Update(MovieData movie);
    }
}
Run Code Online (Sandbox Code Playgroud)

我从存储库调用此dll来在我的webapi应用程序中执行CRUD,现在在我的存储库中我正在编写GetMovieById方法,如果在存储库中找不到电影,我很困惑该返回什么,以及处理此问题的更合适的方法是什么在webapi?

MovieRepository

 public Movie GetMovieById(int movieId)
        {

            MovieData movieData = new MovieDataSource().GetDataById(movieId);
            if (movieData != null)
        {
            return MovieDataToMovieModel(movieData);
        }
        else
        {
            ??
        }
    }
Run Code Online (Sandbox Code Playgroud)

MoviesController

/// <summary>
/// Returns a movie
/// </summary>
/// <param name="movie">movieId</param>
/// <returns>Movie</returns>
   public Movie Get(int movieId)
    {
    //try
    //{
        var movie = repository.GetMovieById(movieId);
        if (movie == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        return movie;
    //}
    //catch (Exception e)
    //{
    //    if (e is HttpResponseException)
    //    throw new HttpResponseException(HttpStatusCode.NotFound);
    //}
}
Run Code Online (Sandbox Code Playgroud)

Den*_*nis 4

通常,如果实体未通过其主键找到,则应抛出异常。
根据用例,您可以在存储库中放置两种方法(以及与存储库一起使用的外部代码):

public MovieData GetDataById(int id); // this throws an exception, if not found
public MovieData GetDataByIdOrDefault(int id); // this returns null, if not found
Run Code Online (Sandbox Code Playgroud)

如果实体必须存在于数据源中,则调用第一个;如果实体可以存在于数据源中,则调用第二个。

  • @demonicdaron,IMO,这必须抛出自定义的“EntityNotFoundException”(或类似的)。不幸的是,现代 .NET 中没有开箱即用的工具。 (2认同)