AutoMapper - ConstructProjection使用异常

时间:2016-07-01 02:59:12

标签: c# entity-framework automapper

使用AutoMapper 5,我确信我正确设置了这个,但我仍然得到EF异常:

'Only parameterless constructors and initializers are supported in LINQ to Entities.'

堆栈跟踪:

     at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MemberInitTranslator.TypedTranslate(ExpressionConverter parent, MemberInitExpression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input, DbExpressionBinding& binding)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& lambda)

我环顾四周看到在4.1.0+中针对此方法的错误实现了修复,但我已经验证我使用的是5.0.0并且看到了与此处描述的问题类似的行为:{{ 3}}

我的数据对象很简单:

Character.cs:

    public class Character : BaseModel
{
            public string Name {get;set;}
            public string Style { get; set; }
            public string MainImageUrl { get; set; }
            public string ThumbnailUrl { get; set; }
            public string Description { get; set; }
            public string ColorTheme { get; set; }
            public string Name { get; set; }
            public int Id { get; set; }
    }

CharacterDto.cs:

public class CharacterDto
    {
        public string Name { get; }

        public CharacterDto(string name)
        {
            Name = name;
        }
    }

这是一个Web Api,我在Startup中配置我的映射:

Mapper.Initialize(cfg => cfg.CreateMap<Character, CharacterDto>()
               .ConstructProjectionUsing(c => new CharacterDto(c.Name)));

我正在使用EF 6并返回IQueryable<CharacterDto>

[Route("characters")]
        public IQueryable<CharacterDto> GetCharacters()
        {
            return Db.Characters.ProjectTo<CharacterDto>();
        }

在我的上下文中,字符数据是IDbSet<Character>

我很可能会遗漏一些简单的东西,但到目前为止我无法弄清楚它是什么。

1 个答案:

答案 0 :(得分:1)

问题不在Automapper中。您在EF的表达式树中看到的问题(缺少堆栈跟踪)。 EF在其表达式树中不支持参数化构造函数。在将实体发送到Automapper之前,可能会在某个地方使用ToList来实现实体。