第一
我已经创建了此GitHub repo ,只需按F5键即可解决此错误,因此您可以轻松尝试一下。该问题中的所有链接都指向该存储库。
代码流
我想在前端控制器中使用following expression code,让前端开发人员有权包含他们所需的关系。
// The included tables I want to control from my controller
Expression<Func<CompanyDto, object>>[] includes = { x => x.Employees, x => x.Cars };
var companyDto2 = await service.GetByIdAsync(1, includes).ConfigureAwait(false);
,然后在我的服务层I map the dto includes to my entity includes中,将它们发送到存储库
var entityIncludes = mapper.Map<Expression<Func<Entity, object>>[]>(includes);
var result = await repository.GetByIdAsync(id, entityIncludes).ConfigureAwait(false);
错误
在repository中运行包含表达式时,出现以下错误。
“代码应该无法访问”
这是我尝试抛出此错误的事情的两个示例。
首次尝试
这是来自enter link description here
的尝试var queryableResultWithIncludes = includes
.Aggregate(dbContext.Set<TEntity>().AsQueryable(),
(current, include) => current.Include(include));
// return the result of the query using the specification's criteria expression
var result = queryableResultWithIncludes.AsEnumerable();
// Here we get "Code supposed to be unreachable"
var neverHappens = result .ToList();
第二次尝试
// Second attempts
if (includes.Length > 0)
{
IQueryable<TEntity> set = includes
.Aggregate<Expression<Func<TEntity, object>>, IQueryable<TEntity>>
(dbContext.Set<TEntity>(), (current, expression) => current.Include(expression));
// Here we also get "Code supposed to be unreachable"
return await set.SingleOrDefaultAsync(s => s.Id == id).ConfigureAwait(false);
}
摘要
我想念什么?我在做某种反模式的东西吗?我需要一些EF专家告诉我:-)
答案 0 :(得分:0)
正如我所怀疑的那样,该问题与EF没有什么共同之处,但是这里的AutoMapper表达式翻译产生的表达式无效:
var entityIncludes = mapper.Map<Expression<Func<Entity, object>>[]>(includes);
可以通过在“本地/监视”窗口中展开entityIncludes
变量来看到-您将看到有问题的调试视图异常或Parameters
的{{1}}属性。
话虽这么说,问题是由于AutoMapper配置不正确引起的,尤其是缺少LambdaExpression
引起的。您是针对AutoMapper全局配置执行此操作的,但是您的代码使用的是依赖项注入,因此您需要在其中进行操作,例如
当前
AddExpressionMapping()
应该是
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
// Auto Mapper Configurations
AutoMapper.Mapper.Initialize(cfg =>
{
cfg.DisableConstructorMapping();
cfg.AddExpressionMapping();
cfg.AddProfile<CompanyProfile>();
});