Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架单一错误消息_C#_.net_Entity Framework - Fatal编程技术网

C# 实体框架单一错误消息

C# 实体框架单一错误消息,c#,.net,entity-framework,C#,.net,Entity Framework,我有很多这样的代码 var employee = dbContext.Employees.Single(x => x.Id == dto.Id); 在编辑之前,我使用单次查找查看数据库中是否存在gievn Id的记录 如果Id不存在,尽管我得到一个内部错误,用户不知道会发生什么 如何编写干净的代码来捕获此错误并向用户显示一条漂亮的错误消息,而不使用SingleOrDefault并检查null 示例(我可以这样做,但我必须在100多个位置复制粘贴此代码) 您可以使用此扩展而不是Single

我有很多这样的代码

var employee = dbContext.Employees.Single(x => x.Id == dto.Id);
在编辑之前,我使用单次查找查看数据库中是否存在gievn Id的记录

如果Id不存在,尽管我得到一个内部错误,用户不知道会发生什么

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

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


您可以使用此扩展而不是
SingleOrDefault()

public static T SingleOrDefaultWithErrorMessage(此DbSet entities,Func predicate=null,String entityName=“the record”),其中T:class
{
变量实体=谓词!=null
?实体。SingleOrDefault(谓词)
:entities.SingleOrDefault();
如果(实体!=null)
返回实体;
抛出新的ApplicationException($“找不到{entityName}”);
}
我添加了一个可选参数,以便您可以指定实体的友好名称


请记住,如果
谓词
不够具体,您仍然可以得到异常
序列包含多个元素
,这可能会让您的用户感到困惑。您也可以选择在此扩展方法中处理该异常。

有没有办法从T动态获取entityName?您可以使用
typeof(T)。Name
但这是假设您的类/实体的名称对您的用户有意义。我有一些不同的类型besdies DbSet需要使用此扩展。有没有办法使用ICollection而不是DBSet?我有IQuerable、List和DBSet,所有这些都可以调用now@TWilly您应该能够将其用于这些,测试并查看。您可以将
DbSet
更改为
IEnumerable
,它将针对您提到的所有类型进行编译。
var employee = dbContext.Employees.SingleOrDefault(x => x.Id == dto.Id);
if(employee == null){
    throw new BusinessException("Could not find Employee");
}
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}.");
}