我正在使用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
当我尝试搜索数据库中不存在的电影时,我收到错误消息。有没有办法可以返回一个类型,说明数据库中不存在这样的行?或者我应该只返回一个空对象?
答案 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);
....
基本上什么也没告诉你。