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(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 } ))' 无法翻译。附加信息:'SetProperty' 的以下 lambda 参数不代表要设置的有效属性:'p => p.YogabandyFee'。有关更多信息,请参阅https://go.microsoft.com/fwlink/?linkid=2101038 。在 Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)在 Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.Translate(表达式表达式)在 Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.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](Expression query, CancellationToken cancellationToken) 位于 Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.ExecuteAsync[TResult](Expression expression, CancellationToken cancellationToken) 位于 Microsoft.EntityFrameworkCore.RelationalQueryableExtensions.ExecuteUpdateAsync[TSource](IQueryable1 source, Expression
1 setPropertyCalls, CancellationToken cancellationToken) 位于 Functions.ReconcileTransfers.Run(String myQueueItem) 中 /Users/charles/yogabandy2020/Functions/ReconcileTransfers.cs:line 119
ExecuteUpdateAsync 将尝试根据您编写的 c# 代码创建 SQL 查询。在 c# 代码中,您尝试在同一个查询中同时更新两个表。这是不可能的。即使您自己编写 SQL,大多数 DMBS 也不允许这样做。(MySQL 除外)
从你的错误信息中
似乎解析器正在寻找属性而不是对象,因此,我尝试
TotalFee
设置YogabandyFee
:你会看到这个错误:
我想说的是:
ExecuteUpdate
只能更新一个表。我认为,“我可以在这种类型的更新中创建新条目吗?”的答案是“否”。我的建议:
UnitOfWork
执行多个查询_dbContext
ExecuteUpdateAsync
如果不存在性能问题,您还可以执行两次单独的操作,每次针对每个表进行更新。抛出 System.InvalidOperationException 异常是因为 EF 中的 ExecuteUpdateAsync 方法不支持在更新操作中直接创建或分配新实体。因此,您可以先更新主实体,然后再更新“YogabandyFee”。