Tenho uma aplicação em Blazor .NET 5, nela eu tenho uma página que tem a finalidade de exibir uma lista de missões e quando o usuário clicar, a missão é exibida. Estou usando o Entity Framework Core para persistir os dados no SQL Server. Até esse ponto, está funcionando corretamente, a lista de missões estão sendo carregadas e exibidas e quando o usuário clica, exibi a respectiva missão. Porém, também é necessário exibir as condições para que a tarefa seja concluída e essas condições estão em outra tabela do banco de dados. Nisto estou tendo os seguintes cenários:
- No uso do Lazy Loading, apenas as condições da primeira missão são obtidas e as demais ficam sem condições, apesar de terem.
- De outra maneira, fazendo a persistência de dados manualmente, todas as missões ficam com as condições da primeira missão.
Tentei depurar neste segundo cenário, porém o único momento que me parece errado, por algum motivo, é quando o EF Core me retorna as condições que são da primeira missão, mesmo eu especificando o id de outra.
Exemplo da entidade de uma missão (Quest.cs):
public class Quest
{
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
// Propriedade para o cenário de Lazy Loading.
public virtual ICollection<QuestCondition> Conditions { get; set; }
}
Exemplo da entidade de uma condição de uma missão (QuestCondition.cs):
public class QuestCondition
{
public int Id { get; set; }
public int QuestId { get; set; }
public string Title { get; set; }
// Propriedade para o cenário de Lazy Loading.
public virtual Quest Quest { get; set; }
}
Obs.: As classes Quest e QuestCondition estão em um projeto .NET Framework v4.0, não sei se isso pode ter influência.
Exemplo da página de missões:
Quests.razor
@page "/quests/{id:int?}"
<nav>
@foreach (var quest in QuestsList)
{
var href = $"/quests/{quest.Id}";
<NavLink href="@href">
@quest.Title
</NavLink>
</nav>
@if (CurrentQuest is not null)
{
<h1>
@CurrentQuest.Title
</h1>
@{
// Cenário com Lazy Loading.
var conditions = CurrentQuest.Conditions;
// Cenário manual.
var conditions = CurrentQuestConditions;
foreach (var condition in conditions)
{
<p>
@condition.Title
</p>
}
}
}
Quests.razor.cs
public partial class Quests
{
(Inject)
private GameDbContext GameDbContext { get; init; }
(Parameter)
private int QuestId { get; init; }
private Quest CurrentQuest { get; set; }
// Propriedade para o cenário manual.
private QuestCondition CurrentQuestCondition { get; set; }
private IList<Quest> QuestsList { get; set; }
protected override async Task OnParametersSetAsync()
{
if (QuestId > 0)
{
CurrentQuest =
await GameDbContext.Quests.FirstOrDefaultAsync(e => e.Id == QuestId);
}
QuestsList = await GameDbContext.Quests.ToListAsync();
if (CurrentQuest is null)
{
CurrentQuest = QuestsList.First();
}
// Cenário manual.
CurrentQuestCondition =
await GameDbContext.QuestConditions.Where(e => e.QuestId == CurrentQuest.Id).ToListAsync();
}
}