2016-07-01 12 views
1

をConstructProjectionUsingし、私はこれを正しく設定したと確信していたが、私はまだEF例外を取得:AutoMapper - AutoMapper 5を使用して例外

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

これは、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>です。

私はたぶんシンプルなものを見逃している可能性がありますが、これまでのところ何かを理解することはできません。

+0

新しいCharacterDto(){Name = c.Name} // CharacterDtoにデフォルトコンストラクタを追加 –

+0

@BassamAlugili CharacterDto.Nameは読み取り専用です。私の理解では、.ConstuctProjectionUsingはデフォルト以外のコンストラクタの使用を許可しました。 – Jordan

答えて

1

問題はAutomapperにはありません。 EFの式ツリーで見た問題(スタックトレースがない)。 EFは、その式ツリー内のパラメータ化されたコンストラクタをサポートしていません。 Automapperに送る前にエンティティを実体化するToListのどこかで行うこともあります。

+1

申し分なく十分です。私は、私はそのEFの制限を回避できるようになる前にそれを投影にクエリを実行するときautomapperが舞台裏で何かをしたかどうかで混乱していたと思います。 – Jordan

関連する問題