2016-07-01 2 views
1

Использование AutoMapper 5, и я был уверен, что я устанавливал это правильно, но я все еще получаю исключение EF:AutoMapper - ConstructProjectionUsing исключение

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

StackTrace:

 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; 
     } 
    } 

Это веб-Апи и я конфигурирование моего отображения в Ввод в эксплуатацию:

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>.

Скорее всего, я пропустил что-то простое, но я не могу понять, что это такое.

+0

попробуйте сделать это как и вернуть мне обратную связь: new CharacterDto() {Name = c.Name} // Добавить конструктор по умолчанию в вашем CharacterDto –

+0

@BassamAlugili CharacterDto.Name - только для чтения. Мое понимание заключалось в том, что .ConstuctProjectionUsing допускает использование конструкторов, отличных от по умолчанию. – Jordan

ответ

1

Проблема не в Automapper. Проблема, как вы видели в своем дереве выражений EF (отсутствует stacktrace). EF не поддерживает параметризованные конструкторы в своем дереве выражений. Возможно, вы делаете что-то ToList для материализации сущностей, прежде чем отправлять его в Automapper.

+1

Хорошо справедливо. Я думаю, что меня смутило то, что автоперпер сделал что-то за кулисами при выполнении запроса до проецирования, что позволило бы мне обойти это ограничение EF. – Jordan

Смежные вопросы