CompileMappings при запуске с расширениями AutoMapper для ASP.NET Core - PullRequest
0 голосов
/ 11 мая 2018

Я использую расширения AutoMapper для ASP.NET Core , поэтому регистрирую Automapper при запуске, как в этом официальном примере . Я хотел бы скомпилировать сопоставления при запуске, вместо того, чтобы позволить Automapper выполнять ленивую компиляцию по умолчанию, но, похоже, не могу понять, как выполнить стремительную компиляцию (задокументировано здесь ) с этой настройкой. Я попробовал следующее, но из того, что я могу сказать, это не вызывает компиляцию:

services.AddAutoMapper();
Mapper.Configuration.CompileMappings();

Проблема, которую я пытаюсь решить, состоит в том, что одно конкретное отображение довольно сложно, вызывая несколько функций форматирования, и первое попадание всегда очень медленное. Я бы хотел, чтобы эта стоимость была понесена при запуске приложения, а не при первом выполнении карты.

РЕДАКТИРОВАТЬ : После дальнейшего исследования кажется, что снижение производительности происходит из-за компиляции запроса EF Core, что побудило меня попытаться предварительно скомпилировать запрос следующим образом:

var query = EF.CompileQuery((MyProjectContext db, int id) =>
  db.Product.ProjectTo<Models.Product>().FirstOrDefault()
);
var product= query(context, 1);

Однако кажется, что ProjectTo нельзя использовать с EF.CompileQuery, так как я получаю эту ошибку при попытке выполнить:

Test method MyProject.Test.MappingTest.ProductGetPreCompile threw exception: 
System.NotSupportedException: Could not parse expression 'value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[MyProject.Data.Entities.Product]).ProjectTo(value(System.Linq.Expressions.Expression`1[System.Func`2[MyProject.Web.Models.Product,System.Object]][]))': This overload of the method 'AutoMapper.QueryableExtensions.Extensions.ProjectTo' is currently not supported.
    at Remotion.Linq.Parsing.Structure.MethodCallExpressionParser.GetNodeType(MethodCallExpression expressionToParse)
at Remotion.Linq.Parsing.Structure.MethodCallExpressionParser.Parse(String associatedIdentifier, IExpressionNode source, IEnumerable`1 arguments, MethodCallExpression expressionToParse)
at Remotion.Linq.Parsing.Structure.ExpressionTreeParser.ParseMethodCallExpression(MethodCallExpression methodCallExpression, String associatedIdentifier)
at Remotion.Linq.Parsing.Structure.ExpressionTreeParser.ParseNode(Expression expression, String associatedIdentifier)
at Remotion.Linq.Parsing.Structure.ExpressionTreeParser.ParseMethodCallExpression(MethodCallExpression methodCallExpression, String associatedIdentifier)
at Remotion.Linq.Parsing.Structure.ExpressionTreeParser.ParseTree(Expression expressionTree)
at Remotion.Linq.Parsing.Structure.QueryParser.GetParsedQuery(Expression expressionTreeRoot)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](Expression query, INodeTypeProvider nodeTypeProvider, IDatabase database, IDiagnosticsLogger`1 logger, Type contextType)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CreateCompiledQuery[TResult](Expression query)
at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQuery`2.CreateCompiledQuery(IQueryCompiler queryCompiler, Expression expression)
at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryBase`2.<>c__DisplayClass6_0.<EnsureExecutor>b__0(TContext c, LambdaExpression q)
at Microsoft.EntityFrameworkCore.Internal.NonCapturingLazyInitializer.EnsureInitialized[TParam1,TParam2,TValue](TValue& target, TParam1 param1, TParam2 param2, Func`3 valueFactory)
at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryBase`2.EnsureExecutor(TContext context)
at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryBase`2.ExecuteCore(TContext context, CancellationToken cancellationToken, Object[] parameters)
at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryBase`2.ExecuteCore(TContext context, Object[] parameters)
at MyProject.Test.MappingTest.ProductGetPreCompile() in C:\projects\MyCompany\MyCustomer\MyProject\MyProject.Test\MappingTest.cs:line 47
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...