当数据库中没有这样的行时,我该返回什么?

时间:2018-05-17 06:24:42

标签: c# entity-framework error-handling

我正在使用Entity框架,我有一个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 :(得分:1)

你可以使用这个包:https://github.com/vkhorikov/CSharpFunctionalExtensions#make-nulls-explicit-with-the-maybe-type

然后你可以设置为return:

public Maybe<MovieDetails> FindSingle(int? id)

所以你调用你的函数,你知道它可能是null。你必须检查:if (customerOrNothing.HasNoValue)

希望它有所帮助!

答案 1 :(得分:0)

对这样的事情使用例外是一个坏主意 例外是指特殊事物,即您无法在代码中控制的内容,如网络错误和I / O权限违规 这种事情是Eric Lippert would call a vexing exception

  

Vexing 例外是不幸的设计决策的结果。在完全非特殊情况下抛出异常情况,因此必须始终抓住并处理。

     

一个令人烦恼的异常的典型例子是Int32.Parse,如果你给它一个不能被解析为整数的字符串,它会抛出。但是这个方法的99%用例是转换用户输入的字符串,这可能是任何旧的东西,因此解析失败绝不是例外。更糟糕的是,如果没有自己实现整个方法,调用者就无法提前确定他们的参数是否是坏的,在这种情况下,他们不需要首先调用它。

     

这个令人遗憾的设计决定非常令人烦恼,当然框架团队此后不久就实施了TryParse,这是正确的。

如果MappedDetails是参考类型,如果找不到,则最好返回null
如果它是值类型,请更改您的方法以返回MovieDetails?并返回null

我还建议您将方法名称从FindSingle更改为GetMovieDetails或沿这些行更新。
这样,当你从现在起6个月后查看代码并看到这样的代码:

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

您可以立即知道该方法实际执行的操作,与

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

基本上什么也没告诉你。