如何运行 EF Core ExecuteUpdateAsync 并添加新实体作为更新的一部分?

问题描述 投票:0回答:1

我正在运行下面的代码,但在运行时出现

YogabandyFee
异常。

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)
);

这可以做到吗? 我可以在此类更新中创建新条目吗?

这是错误:

System.InvalidOperationException:LINQ表达式'DbSet().Where(s => s.StripePayoutId == __stripePayoutId_0).LeftJoin(内部:DbSet(),outerKeySelector:s => EF.Property(s,“Id”), innerKeySelector: y => EF.Property(y, "StripePayoutId"), resultSelector: (o, i) => 新透明标识符( 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 } ))' 无法被翻译。附加信息:“SetProperty”的以下 lambda 参数不代表要设置的有效属性:“p => p.YogabandyFee”。请参阅 https://go.microsoft.com/fwlink/?linkid=2101038 了解更多信息。在 Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatedExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression) 在 Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatedExpressionVisitor.Translate(表达式表达式) 在 Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatedExpressionVisitor.Translate(表达式表达式) 在 Microsoft.EntityFrameworkCore.Query.QueryCompilationContext .CreateQueryExecutor[TResult](表达式查询)位于 Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](表达式查询,布尔异步)位于 Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase 数据库,表达式查询) 、 IModel 模型、布尔异步)位于 Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass12_0

1.b__0() at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func
1 编译器)位于 Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.ExecuteAsync[TResult](表达式查询、CancellationToken CancellationToken) Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.ExecuteAsync[TResult](表达式表达式,CancellationTokencancellationToken)在Microsoft.EntityFrameworkCore.RelationalQueryableExtensions.ExecuteUpdateAsync[TSource](IQueryable
1 source, Expression
1 setPropertyCalls,CancellationTokencancellationToken)在Functions.ReconcileTransfers.Run(字符串 myQueueItem) 在 /Users/charles/yogabandy2020/Functions/ReconcileTransfers.cs:第 119 行

c# .net entity-framework-core
1个回答
0
投票

抛出 System.InvalidOperationException 异常,因为 EF 中的 ExecuteUpdateAsync 方法不支持直接在更新操作中创建或分配新实体。因此,您可以做的是首先更新主要实体,然后更新“YogabandyFee”。

© www.soinside.com 2019 - 2024. All rights reserved.