AutoMapper - ConstructProjectionUsing 异常
AutoMapper - ConstructProjectionUsing exception
使用 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 并看到与此处描述的问题类似的行为: https://github.com/AutoMapper/AutoMapper/issues/909
我的数据对象很简单:
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,我正在启动中配置我的映射:
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>
。
我很可能遗漏了一些简单的东西,但到目前为止我无法弄清楚它是什么。
问题不在 Automapper 中。您在 EF 的表达式树中看到的问题(缺少堆栈跟踪)。 EF 在其表达式树中不支持参数化构造函数。在将实体发送到 Automapper 之前,您可能会在某处执行 ToList 以具体化实体。
使用 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 并看到与此处描述的问题类似的行为: https://github.com/AutoMapper/AutoMapper/issues/909
我的数据对象很简单:
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,我正在启动中配置我的映射:
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>
。
我很可能遗漏了一些简单的东西,但到目前为止我无法弄清楚它是什么。
问题不在 Automapper 中。您在 EF 的表达式树中看到的问题(缺少堆栈跟踪)。 EF 在其表达式树中不支持参数化构造函数。在将实体发送到 Automapper 之前,您可能会在某处执行 ToList 以具体化实体。