Estou executando o código abaixo, mas recebo uma exceção ao YogabandyFee
executá-lo.
var payoutResult = await _dbContext.StripePayouts
.Where(p => p.StripePayoutId == stripePayoutId)
.Select(p => new { p.GrossAmount, p.TotalTokens, p.NetAmount, p.ReconciledTransfers, p.EditedDate, p.YogabandyFee })
.ExecuteUpdateAsync(setters => setters
.SetProperty(p => p.GrossAmount, grossAmount)
.SetProperty(p => p.TotalTokens, totalTokens)
.SetProperty(p => p.YogabandyFee, p => new YogabandyFee { TotalFee = (grossAmount - p.NetAmount - platformFee) } )
.SetProperty(p => p.ReconciledTransfers, true)
.SetProperty(p => p.EditedDate, DateTime.UtcNow)
);
Isso pode ser feito? Posso criar uma nova entrada neste tipo de atualização?
Aqui está o erro:
System.InvalidOperationException: A expressão LINQ 'DbSet() .Where(s => s.StripePayoutId == __stripePayoutId_0) .LeftJoin( inner: DbSet(), outerKeySelector: s => EF.Property(s, "Id"), innerKeySelector : y => EF.Property(y, "StripePayoutId"), resultSelector: (o, i) => new TransparentIdentifier( Outer = o, Inner = i )) .Select(s => new { GrossAmount = s.Outer. GrossAmount, TotalTokens = s.Outer.TotalTokens, NetAmount = s.Outer.NetAmount, ReconciledTransfers = s.Outer.ReconciledTransfers, EditedDate = s.Outer.EditedDate, YogabandyFee = s.Inner }) .ExecuteUpdate(setters => setters.SetProperty ( propertyExpression: p => p.GrossAmount, valueExpression: __grossAmount_1).SetProperty( propertyExpression: p => p.TotalTokens, valueExpression: __totalTokens_2).SetProperty( propertyExpression: p => p.ReconciledTransfers, valueExpression: True).SetProperty( propertyExpression : p => p.EditedDate, valueExpression: DateTime.UtcNow).SetProperty( propertyExpression: p => p.YogabandyFee, valueExpression: p => new YogabandyFee{ TotalFee = __grossAmount_1 - p.NetAmount - __platformFee_3 } ))' não pôde ser traduzido. Informações adicionais: O seguinte argumento lambda para 'SetProperty' não representa uma propriedade válida a ser definida: 'p => p.YogabandyFee'. Consulte https://go.microsoft.com/fwlink/?linkid=2101038 para obter mais informações. em Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression) em Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.Translate(expressão de expressão) em Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.Trans tarde (expressão de expressão) em Microsoft.EntityFrameworkCore.Query.QueryCompilationContext .CreateQueryExecutor[TResult](consulta de expressão) em Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](consulta de expressão, booleano assíncrono) em Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](banco de dados IDatabase, consulta de expressão , modelo IModel, booleano assíncrono) em Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass12_0
1.b__0() at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func
1 compilador) em Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.ExecuteAsync[TResult](Expression query, CancellationToken cancelToken) em Microsoft.EntityFrameworkCore .Query.Internal.EntityQueryProvider.ExecuteAsync[TResult](Expressão de expressão, CancellationToken cancelToken) em Microsoft.EntityFrameworkCore.RelationalQueryableExtensions.ExecuteUpdateAsync[TSource](IQueryable1 source, Expression
1 setPropertyCalls, CancellationToken cancellationToken) em Functions.ReconcileTransfers.Run(String myQueueItem) em /Users /charles/yogabandy2020/Functions/ReconcileTransfers.cs:linha 119
ExecuteUpdateAsync tentará criar uma consulta SQL com base no código c# que você escreve. No código c#, você está tentando atualizar duas tabelas ao mesmo tempo na mesma consulta. Não é possível. Mesmo escrevendo seu próprio SQL, a maioria dos DMBS não permite isso. (com exceção do MySQL)
Da sua mensagem de erro
parece que o analisador está procurando uma propriedade em vez de um objeto, então, tentei definir o
TotalFee
deYogabandyFee
:E você verá este erro:
O que estou tentando dizer é:
ExecuteUpdate
só é possível atualizar uma tabela. Acho que a resposta para "Posso criar uma nova entrada neste tipo de atualização?" é não.Minhas sugestões:
UnitOfWork
- permite fazer múltiplas_dbContext
consultas na mesma transaçãoVocê também pode fazer duas atualizações separadas
ExecuteUpdateAsync
, uma para cada atualização de tabela, se não for um problema de desempenho.A exceção System.InvalidOperationException é lançada porque o método ExecuteUpdateAsync no EF não suporta a criação ou atribuição de novas entidades diretamente na operação de atualização. Portanto, o que você pode fazer é primeiro atualizar a entidade principal e depois atualizar o ‘YogabandyFee’.