2016-12-13 4 views
1

automapper 5.2.0をEFコア1.0.1と組み合わせて使用​​し、メモリ内のSQL Liteを使用します。私の代わりに私が得ることが期待されるデータベースクエリを作成するために得ることができないこの:QueryableExtensions ProjectTo投影しないマップ

Microsoft.EntityFrameworkCore.Query.RelationalQueryCompilationContextFactory:警告: ザ・ナビゲーションのための操作を含める:「a.PostTags.Tag」は無視されました 最終的なクエリでターゲットのナビゲーションに到達できないため、 の結果が表示されます。この警告を構成するには、 DbContextOptionsBuilder.ConfigureWarnings API(イベントID 'CoreEventId.IncludeIgnoredWarning')を使用します。 DbContext.OnConfiguringメソッドをオーバーライドするか、アプリケーションサービスプロバイダの AddDbContextを使用する場合は、ConfigureWarningsを使用して を使用できます。 Microsoft.EntityFrameworkCore.Query.RelationalQueryCompilationContextFactory:警告: 最後の クエリ結果で、ターゲットのナビゲーションに到達できないため、ナビゲーションのための操作: 'a.Responses.CreatedByUser'は、 が無視されました。この警告を構成するには、 DbContextOptionsBuilder.ConfigureWarnings API(イベントID 'CoreEventId.IncludeIgnoredWarning')を使用します。 DbContext.OnConfiguringメソッドをオーバーライドするか、アプリケーションサービスプロバイダの AddDbContextを使用する場合は、ConfigureWarningsを使用して を使用できます。 Microsoft.EntityFrameworkCore.Query.RelationalQueryCompilationContextFactory:警告: 最後のクエリでターゲットのナビゲーションに到達できないため、ナビゲーションのためのインクルード操作: 'a.CreatedByUser'は無視されました 結果。この警告を構成するには、 DbContextOptionsBuilder.ConfigureWarnings API(イベントID 'CoreEventId.IncludeIgnoredWarning')を使用します。 DbContext.OnConfiguringメソッドをオーバーライドするか、アプリケーションサービスプロバイダの AddDbContextを使用する場合は、ConfigureWarningsを使用して を使用できます。 Microsoft.EntityFrameworkCore.Query.RelationalQueryCompilationContextFactory:警告: 最終的なクエリ結果でターゲットナビゲーションに到達できないため、ナビゲーションのための操作: 'a.Category'が無視されました。 にこの警告を設定するには、 DbContextOptionsBuilder.ConfigureWarnings API(イベントID 'CoreEventId.IncludeIgnoredWarning')を使用します。 DbContext.OnConfiguringメソッドをオーバーライドするか、アプリケーションサービスプロバイダの AddDbContextを使用する場合は、ConfigureWarningsを使用して を使用できます。 [1] "1" FROM "FROM" FROM "FROM" FROM "FROM" FROM "FROM" msgstr " a " " a "。"PostId" = @__ ID_0 LIMITは2

ここに私の設定です:

スタートアップ:

public class Startup 
{ 
    private MapperConfiguration _mapperConfiguration { get; set; } 

    public Startup(IHostingEnvironment env) 
    { 
     ... 
     _mapperConfiguration = new MapperConfiguration(cfg => 
     { 
      ... 
      cfg.AddProfile(new PostMapperProfile()); 
     }); 

     _mapperConfiguration.AssertConfigurationIsValid(); 
    } 


    public void ConfigureServices(IServiceCollection services) 
    { 
     ... 
     services.AddSingleton<IMapper>(sp => _mapperConfiguration.CreateMapper()); 
     services.AddSingleton<MapperConfiguration>(sp => _mapperConfiguration); 
    } 
} 

PostMapperProfile:

public class PostMapperProfile : Profile 
{ 
    public PostMapperProfile() 
    { 
     var postDetailMap = CreateMap<PostEntity, PostDetailModel>(); 
     postDetailMap.ForAllMembers(opt => opt.Ignore()); 
     postDetailMap.ForMember(m => m.Category, opt => opt.MapFrom(src => src.CategoryId.HasValue ? src.Category : null)); 
     postDetailMap.ForMember(m => m.CreatedAt, opt => opt.MapFrom(src => src.CreatedAt)); 
     postDetailMap.ForMember(m => m.CreatedByUser, opt => opt.MapFrom(src => src.CreatedByUser)); 
     postDetailMap.ForMember(m => m.PostId, opt => opt.MapFrom(src => src.PostId)); 
     postDetailMap.ForMember(m => m.PostState, opt => opt.MapFrom(src => src.PostState)); 
     postDetailMap.ForMember(m => m.PostType, opt => opt.MapFrom(src => src.PostType)); 
     postDetailMap.ForMember(m => m.ResponsesCount, opt => opt.MapFrom(src => src.Responses.Count)); 
     postDetailMap.ForMember(m => m.Text, opt => opt.MapFrom(src => src.Text)); 
     postDetailMap.ForMember(m => m.Tags, opt => opt.MapFrom(src => src.PostTags.Select(x => x.Tag).ToList())); 
     postDetailMap.ForMember(m => m.Title, opt => opt.MapFrom(src => src.Title)); 
     postDetailMap.ForMember(m => m.ViewsCount, opt => opt.MapFrom(src => src.ViewsCount)); 
     postDetailMap.ForMember(m => m.VotesCount, opt => opt.MapFrom(src => src.VotesCount)); 
     postDetailMap.ForMember(m => m.Responses, opt => opt.MapFrom(src => PagedList<ResponseEntity>.Create(src.Responses.Take(10).Select(x => AutoMapper.Mapper.Map<ResponseDetailModel>(x)).ToList(), 1, 10, src.Responses.Count))); 
    } 
} 

BlogpostService:

public class BlogpostService 
{ 
    private readonly AppDbContext m_context; 
    private readonly IMapper m_mapper; 
    private readonly MapperConfiguration m_config;  

    public BlogpostService(AppDbContext context, IMapper mapper, MapperConfiguration config) 
    { 
     m_context = context; 
     m_mapper = mapper; 
     m_config = config; 
    } 

    public PostDetailModel GetPostDetail(int id) 
    { 
     var s = m_context.Posts 
      .Include(a => a.CreatedByUser) 
      .Include(a => a.Category) 
      .Include(a => a.PostTags) 
      .ThenInclude(a => a.Tag) 
      .Include(a => a.Responses) 
      .ThenInclude(b => b.CreatedByUser)    
      .Where(x => x.PostId == id); 
      var d = s.Single(); 
     return s.ProjectTo<PostDetailModel>(m_config).Single(); 
    } 
} 

テスト:

public class PostRepositoryTests 
{ 
    public TestServer server { get; } 
    public HttpClient client { get; } 
    private readonly AppDbContext Context; 
    private readonly UserManager<UserEntity> UserManager; 
    private readonly IMapper Mapper; 
    private readonly MapperConfiguration Config; 

    public PostRepositoryTests() 
    { 
     ... 
     Context = serviceProvider.GetRequiredService<AppDbContext>(); 
     UserManager = serviceProvider.GetRequiredService<UserManager<UserEntity>>(); 
     Mapper = serviceProvider.GetService<IMapper>(); 
     Config = serviceProvider.GetService<MapperConfiguration>(); 
    } 

    [Fact] 
    public void CreatePost() 
    { 
     var user = new UserEntity(); 
     user.Email = "[email protected]"; 

     var ct = UserManager.CreateAsync(user, "Testing123.."); 

     var service = new BlogpostService(Context, Mapper, Config); 
     var blogpost = new CreateBlogpostRequest(); 
     blogpost.Title = "Some title"; 
     blogpost.Content = "Some content"; 
     blogpost.Tags = new List<TagDTO>(){ 
      new TagDTO{ 
       Label = "Tag1", 
      }, 
      new TagDTO{ 
       Label = "Tag2", 
      }, 
      new TagDTO{ 
       Label = "Tag3", 
      } 
     }; 

     var response = service.CreateBlogpost(blogpost, user.Id); 
     var postDetail = service.GetPostDetail(response.PostId); 
     Assert.Equal(postDetail.Tags.Count, 3); 
    } 
} 
+0

はどうなりますか? –

+0

@IvanStoevその行は削除されましたが、結果は同じです。 – formatc

+0

あまりにも悪いです。完全な 'mcve'(repro)コードやリンクを投稿できますか?基本的に 'PostEntity'クラスと' PostDetailModel'クラスがなければ何もできません。 –

答えて

1

@IvanStoevは正しい方向に私を指摘し、私は私が私がのいくつかを言ってエラーを得たその行を削除した後

postDetailMap.ForAllMembers(opt => opt.Ignore()); 

はどういうわけか、他のエラーをマスクすると考え、それを解決するために管理しましたプロパティはマップされていないので、これらのメンバーとResponsesプロパティに対して明示的に無視しました。

その後、実際にはクエリを作成しようとしましたが、タグ内で.ToList()が失敗しました(MVC4、AM 4.xからアップグレードしたときに誤って追加しました)。作品

修正マップ:あなたが `m.Responses`を無視した場合

var postDetailMap = CreateMap<PostEntity, PostDetailModel>(); 
    postDetailMap.ForMember(m => m.ResponsesShowing,opt => opt.Ignore()); 
    postDetailMap.ForMember(m => m.Responses, opt => opt.Ignore()); 
    // postDetailMap.ForAllMembers(opt => opt.Ignore()); 
    postDetailMap.ForMember(m => m.Category, opt => opt.MapFrom(src => src.CategoryId.HasValue ? src.Category : null)); 
    postDetailMap.ForMember(m => m.CreatedAt, opt => opt.MapFrom(src => src.CreatedAt)); 
    postDetailMap.ForMember(m => m.CreatedByUser, opt => opt.MapFrom(src => src.CreatedByUser)); 
    postDetailMap.ForMember(m => m.PostId, opt => opt.MapFrom(src => src.PostId)); 
    postDetailMap.ForMember(m => m.PostState, opt => opt.MapFrom(src => src.PostState)); 
    postDetailMap.ForMember(m => m.PostType, opt => opt.MapFrom(src => src.PostType)); 
    postDetailMap.ForMember(m => m.ResponsesCount, opt => opt.MapFrom(src => src.Responses.Count)); 
    postDetailMap.ForMember(m => m.Text, opt => opt.MapFrom(src => src.Text)); 
    postDetailMap.ForMember(m => m.Tags, opt => opt.MapFrom(src => src.PostTags.Select(x => x.Tag))); 
    postDetailMap.ForMember(m => m.Title, opt => opt.MapFrom(src => src.Title)); 
    postDetailMap.ForMember(m => m.ViewsCount, opt => opt.MapFrom(src => src.ViewsCount)); 
    postDetailMap.ForMember(m => m.VotesCount, opt => opt.MapFrom(src => src.VotesCount)); 
    //postDetailMap.ForMember(m => m.Responses, opt => opt.MapFrom(src => PagedList<ResponseEntity>.Create(src.Responses.Take(10).Select(x => AutoMapper.Mapper.Map<ResponseDetailModel>(x)).ToList(), 1, 10, src.Responses.Count)));