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);
}
}
はどうなりますか? –
@IvanStoevその行は削除されましたが、結果は同じです。 – formatc
あまりにも悪いです。完全な 'mcve'(repro)コードやリンクを投稿できますか?基本的に 'PostEntity'クラスと' PostDetailModel'クラスがなければ何もできません。 –