Ho aggiornato la mia app a Ef Core 2.1 e una query che funzionava in EF 2.0 ora genera errori.
Io uso le varianti della stessa query su più tabelle diverse e tutte falliscono con lo stesso errore ora che ho aggiornato
Ecco i miei modelli:
public class Promotion
{
public int PromotionId { get; set; }
// I've removed the other fields
public virtual ICollection<PromotionTopicJoin> PromotionTopicJoins {get; set;}
}
public class PromotionTopic
{
public int PromotionTopicId { get; set; }
[MaxLength(50)]
[Required]
public string Name { get; set; }
public virtual ICollection<PromotionTopicJoin> PromotionTopicJoins {get; set;}
}
public class PromotionTopicJoin
{
public int PromotionId { get; set; }
public Promotion Promotion { get; set; }
public int PromotionTopicId { get; set; }
public PromotionTopic PromotionTopic { get; set; }
}
E questa è la query che eseguo:
return await _context.PromotionTopics
.Where(p => p.PromotionTopicId == TopicId)
.SelectMany(p => p.PromotionTopicJoins)
.Select(pc => pc.Promotion)
.Select(p => new PromotionDTO
{
PromotionId = p.PromotionId,
// I've removed all the other fields
Topics = p.PromotionTopicJoins.Select(itj => itj.PromotionTopic.Name).ToList()
})
.Where(x => x.Is_Active)
.OrderByDescending(x => x.Created)
.ToListAsync();
Lo stacktrace è abbastanza grande, quindi ho incluso solo l'errore e la riga precedente.
System.InvalidOperationException: impossibile trovare la proprietà '' sul tipo di entità 'PromotionTopicJoin'. Assicurarsi che la proprietà esista e sia stata inclusa nel modello. a Microsoft.EntityFrameworkCore.Query.ExpressionVisitors.Internal.MemberAccessBindingExpressionVisitor.GetPropertyPath (Espressione espressione, QueryCompilationContext queryCompilationContext, out QuerySourceReferenceExpression querySourceReferenceExpression)
Cordiali saluti, le mie versioni di Microsoft.EntityFrameworkCore
e Microsoft.EntityFrameworkCore.SqlServer
passate da 2.0.1 a 2.1.0
Sfortunatamente questa è una chiara indicazione del bug di regressione della traduzione di query EF Core.
Pertanto, tutto ciò che puoi fare è segnalarlo a EF Core Issue Tracker . Fornire la stessa .Where(x => x.Is_Active)
minima (rimuovere il .Where(x => x.Is_Active)
e .OrderByDescending(x => x.Created)
- non si compilano attualmente, ma il problema si riproduce senza di essi. Inoltre, si riproduce con ToList
, quindi non è collegato asincrono).
Per risolvere il problema fino a quando il problema non viene risolto, avviare la query direttamente dall'entità join (il problema sembra essere correlato alla navigazione SelectMany
):
return await _context.Set<PromotionTopicJoin>()
.Where(pc => pc.PromotionTopicId == TopicId)
.Select(pc => pc.Promotion)
.Select(p => new PromotionDTO
{
PromotionId = p.PromotionId,
// I've removed all the other fields
Topics = p.PromotionTopicJoins.Select(itj => itj.PromotionTopic.Name).ToList()
})
.Where(x => x.Is_Active)
.OrderByDescending(x => x.Created)
.ToListAsync();