包含的实体框架“应该无法访问的代码”表达式

时间:2019-05-31 10:21:13

标签: c# entity-framework lambda entity-framework-core repository-pattern

第一

我已经创建了此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专家告诉我:-)

1 个答案:

答案 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>();
});