实体框架单一漂亮错误消息

时间:2017-01-05 16:05:27

标签: c# .net entity-framework

我有很多看起来像这样的代码......

var employee = dbContext.Employees.Single(x => x.Id == dto.Id);

在编辑之前,我使用单一查找来查看数据库中是否存在带有gievn Id的记录。

如果Id不存在,但我收到内部错误而用户不知道会发生什么。

如何编写干净的代码来捕获此错误并向用户显示一条不错的错误消息,而不使用SingleOrDefault并检查null。

示例(我可以这样做,但我必须在100多个位置复制粘贴此代码)..

var employee = dbContext.Employees.SingleOrDefault(x => x.Id == dto.Id);
if(employee == null){
    throw new BusinessException("Could not find Employee");
}

1 个答案:

答案 0 :(得分:3)

您可以使用此扩展程序代替SingleOrDefault()

public static T SingleOrDefaultWithErrorMessage<T>(this DbSet<T> entities, Func<T, Boolean> predicate = null, String entityName = "the record") where T : class
{
    var entity = predicate != null
                    ? entities.SingleOrDefault(predicate)
                    : entities.SingleOrDefault();
    if (entity != null)
        return entity;

    throw new ApplicationException($"Could not find {entityName}.");
}

我添加了一个可选参数,以便您可以指定实体的友好名称。

请注意,如果predicate不够具体,您仍然可以获得异常Sequence contains more than one element,这可能会让您的用户感到困惑。您也可以选择在此扩展方法中处理该异常。