我正在用这种方法进行投影:
public async Task<TradeDetail> Get(int tradeId)
{
var firstOrDefaultAsync = await context.EvgTGTrade
.Where(x => x.IdTrade == tradeId)
.Select(trade => new TradeDetail
{
Id = trade.IdTrade,
Code = trade.CdTrade,
Description = trade.DeTrade,
Comments = trade.DeComentarios,
TypeId = trade.IdTipoTrade,
BrokerId = trade.EvgTGBrokerTrade.FirstOrDefault().IdBroker,
BillingCycleId = trade.IdCicloFacturacion,
CounterpartId = trade.IdSujeto,
StartDate = trade.FhIni,
EndDate = trade.FhFin,
SignatureDate = trade.FhFirma,
Positions = trade.EvgTGPosicion.Select(pos => new Position
{
Amount = pos.Cantidad,
Code = pos.CdPosicion,
Description = pos.DePosicion,
LogisticElement = pos.IdElemLogNavigation.DeElemLog,
StartDate = pos.FhIni,
EndDate = pos.FhFin,
FormulaId = pos.IdFormula,
Operations = pos.EvgTGOperacionCv.Select(op =>
new Operation()
{
TypeId = op.IdTipoOperacion,
Fee = op.Fee,
Date = op.FhOperacionCv,
Price = op.NmPrecio ?? 0,
Quantity = op.NmCantidadKwh ?? 0,
}),
})
})
.FirstOrDefaultAsync();
return firstOrDefaultAsync;
}
我在第一行遇到一个例外:
Microsoft.EntityFrameworkCore.Query:错误:迭代上下文类型“SampleApp.EF.MyDbContext”的查询结果时发生异常。
System.InvalidOperationException:可为 Null 的对象必须有一个值。
我已经检查了异常和堆栈跟踪,但它没有说明哪个是有问题的对象。不知道出了什么问题。
那么,有没有一种方法可以知道哪个属性产生了冲突呢?我确信这是属性列不匹配,但是如果您有很多属性怎么办?真是相当痛苦啊!
Update
我已经解决了这个问题。这是由于尝试将 null 分配给我的模型中不可为 null 的属性。
也就是说,这个问题不是关于这个具体的修复,而是关于找到调试这种情况的通用方法(这个例外)这很常见。恕我直言,异常消息太模糊了。它不提供冲突属性的任何有用信息。