DbContext удаляется после навигации.C#

Место общения программистов C#
Ответить
Anonymous
 DbContext удаляется после навигации.

Сообщение Anonymous »

Я разрабатываю веб-приложение blazor и сталкиваюсь со странным поведением. Почти все страницы представляют собой копирование/вставку, на них есть операции CRUD и предыдущий список различных элементов (сезоны, игроки, матчи и т. д.), но только с одной из них у меня возникают проблемы. Когда я нажимаю кнопку «Редактировать» проигрывателя, я получаю сообщение «Невозможно получить доступ к удаленному объекту», относящееся к _dbContext.
Добавив точку останова к методу DisposeAsync(), я обнаружил, что он запускается, когда я перехожу на страницу редактирования. Но это происходит только на странице игрока, а не на других страницах.
Вот страница игрока:
@page "/players"
@attribute [Authorize]

@using Models = Biwenger.Models
@using Biwenger.Services
@inject PlayersService service;
@inject NavigationManager navigationManager;

Jugadores

Añadir

Buscar Jugador:





#
Nombre
Equipo
Acciones



@if (filteredList.Count > 0)
{
foreach (var item in filteredList)
{

@item.Id
@item.Name
@item.Team.Name

Editar


}
}
else
{

No hay registros.

}



@code {

List fullList = new List();
List filteredList = new List();
string searchTerm = "";

protected override async Task OnInitializedAsync()
{
fullList = await service.GetAllPlayers();
filteredList = fullList;
}

private void FilterPlayers()
{
if (string.IsNullOrEmpty(searchTerm))
{
filteredList = fullList;
} else
{
filteredList = fullList.Where(p => p.Name.Contains(searchTerm, StringComparison.OrdinalIgnoreCase))
.ToList();
}

StateHasChanged();
}

private void EditPlayer(int id, int teamId)
{
navigationManager.NavigateTo($"/player/{id}/{teamId}");

Equipo

Seleccione un equipo
@foreach (Models.Team team in listTeams)
{
@team.Name
}




Posición
@if (positionsItems != null)
{



}



Coste @currentSeason!.Name



Es negro


Activo

Volver

@if (isLoading)
{

Enviando...
}
else if (showSuccess)
{
Guardado...
}
else if (showError)
{
Error...
}
else
{
Enviar
}




@code {
private EditContext? editContext;
private ElementReference nameInput;
private ElementReference costInput;
private Biwenger.Models.Season? currentSeason;
private Biwenger.Models.PlayerSeasonCost? currentPlayerCost;

[Parameter]
public int? id { get; set; }

[Parameter]
public int? teamId { get; set; }

[SupplyParameterFromForm]
private PlayerWithCostViewModel? model { get; set; }

private List listTeams = new List();

private ValidationMessageStore? messageStore;

private bool isLoading = false;
private bool showSuccess = false;
private bool showError = false;

private string buttonClassSuccess = "btn-success";
private string buttonClassError = "btn-danger";
private string buttonClassIdle = "btn-primary";
private string buttonClass = "btn-primary";

IList positionsItems;

protected override async Task OnInitializedAsync()
{
positionsItems = new List
{
new Models.DropdownItem { Key = 0, Value = "Posición" },
new Models.DropdownItem { Key = 1, Value = "PT" },
new Models.DropdownItem { Key = 2, Value = "DF" },
new Models.DropdownItem { Key = 3, Value = "MC" },
new Models.DropdownItem { Key = 4, Value = "DL" },
};

editContext = new EditContext(model ??= new PlayerWithCostViewModel());
currentSeason = seasonsService.GetCurrentSeason();
currentPlayerCost = new Models.PlayerSeasonCost();
listTeams = await teamsService.GetAllTeams();

if (id.HasValue && id.Value > 0)
{
model = await service.GetPlayerWithCostById(id.Value, teamId!.Value);
if (model != null)
{
editContext = new EditContext(model);
}
}

messageStore = new ValidationMessageStore(editContext);
}

private async void CheckIfNameExists()
{
if (!string.IsNullOrEmpty(model!.Name))
{
bool exists = await service!.NameExists(model!.Name, id, model!.TeamId);

messageStore?.Clear(() => model.Name);

if (exists)
{
messageStore?.Clear();
messageStore?.Add(() => model.Name, "El nombre ya existe");

}

editContext?.NotifyValidationStateChanged();
}
}

private void GoBack()
{
navigationManager.NavigateTo("/players");
}

private async Task Submit()
{
isLoading = true;
Logger.LogInformation("Se ha llamado a submit");

bool success = false;

if (editContext!.Validate())
{
if (id.HasValue && id.Value > 0)
{
success = await service.UpdatePlayer(model!, currentSeason!.Id);
}
else
{
if (model!.Costs!.Count == 0)
{
model!.Costs.Add(new Models.PlayerSeasonCost()
{
Cost = currentPlayerCost!.Cost,
SeasonId = currentSeason!.Id,
TeamId = model!.TeamId
});
}

success = await service!.AddPlayer(model!);
}

isLoading = false;

if (success)
{
showSuccess = true;
buttonClass = buttonClassSuccess;

StateHasChanged();

await Task.Delay(3000);

showSuccess = false;
buttonClass = buttonClassIdle;

StateHasChanged();

if (!id.HasValue)
{
model = new PlayerWithCostViewModel();
editContext = new EditContext(model);
messageStore = new ValidationMessageStore(editContext);
messageStore.Clear();
}

model!.Name = "";
model.TeamId = 0;
currentPlayerCost = new Models.PlayerSeasonCost();
model!.Black = false;
model!.Active = true;

StateHasChanged();
await JS.InvokeVoidAsync("focusElement", nameInput);
}
else
{
showSuccess = true;
buttonClass = buttonClassError;

await Task.Delay(1000);

showSuccess = false;
buttonClass = buttonClassIdle;
}
}

}

private async Task selectAllText()
{
await JS.InvokeVoidAsync("selectElementText", costInput);
}

private void addMillions()
{
if (currentPlayerCost!.Cost < 100)
{
currentPlayerCost.Cost = currentPlayerCost.Cost * 1000000;
}
}
}

И служба игроков:
using Biwenger.Data;
using Biwenger.Models;
using Biwenger.Models.ViewModels;
using Microsoft.EntityFrameworkCore;

namespace Biwenger.Services
{
public class PlayersService
{
private readonly ApplicationDbContext _dbContext;

public PlayersService(ApplicationDbContext dbContext)
{
_dbContext = dbContext;
}

public async Task GetAllPlayers()
{
return await _dbContext.Players.Include(p => p.Team).AsNoTracking().ToListAsync();
}

public async Task GetAllActivePlayers()
{
return await _dbContext.Players.Where(p => p.Active == true).AsNoTracking().ToListAsync();
}

public async Task AddPlayer(PlayerWithCostViewModel player)
{
var strategy = _dbContext.Database.CreateExecutionStrategy();
bool result = false;

await strategy.ExecuteAsync(async () =>
{
var transaction = await _dbContext.Database.BeginTransactionAsync();

try
{
var newPlayer = new Player
{
Active = player.Active,
Black = player.Black,
TeamId = player.TeamId,
Name = player.Name,
Position = player.Position,
};

await _dbContext.Players.AddAsync(newPlayer);

var playerSeasonCost = new PlayerSeasonCost
{
Cost = player.Costs!.First().Cost,
TeamId = player.TeamId,
PlayerId = newPlayer.Id,
SeasonId = player.Costs!.First().SeasonId,
};

await _dbContext.PlayersSeasonsCost.AddAsync(playerSeasonCost);
await _dbContext.SaveChangesAsync();

await transaction.CommitAsync();
result = true;
}
catch (Exception ex)
{
await transaction.RollbackAsync();

result = false;
}
});

return result;
}

public async Task UpdatePlayer(PlayerWithCostViewModel player, int seasonId)
{
Player? currentPlayer = await _dbContext.Players.FindAsync(player.PlayerId);

if (currentPlayer == null)
{
return false;
}

var transaction = await _dbContext.Database.BeginTransactionAsync();

try
{
currentPlayer.Name = player.Name;
currentPlayer.Black = player.Black;
currentPlayer.Position = player.Position;
currentPlayer.Active = player.Active;
currentPlayer.TeamId = player.TeamId;

_dbContext.Players.Update(currentPlayer);
await _dbContext.SaveChangesAsync();

await transaction.CommitAsync();
return true;
}
catch (Exception ex)
{
await transaction.RollbackAsync();
return false;
}
}

public async Task GetPlayerByid(int id)
{
return await _dbContext.Players.FindAsync(id);
}

public async Task GetPlayerWithCostById(int playerId, int teamId)
{
try
{

Player? player = await _dbContext.Players
.Include(p => p.PlayersSeasonsCost)
.Where(p => p.Id == playerId && p.TeamId == teamId)
.FirstOrDefaultAsync(); psc.PlayerId == playerId).AsNoTracking().ToListAsync();

PlayerWithCostViewModel pwcvm = new PlayerWithCostViewModel
{
PlayerId = playerId,
TeamId = teamId,
Active = player.Active,
Black = player.Black,
Position = player.Position,
Name = player.Name,
Costs = pscList ??= new List()
};

return pwcvm;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return null;
}
}

public async Task NameExists(string name, int? id, int teamId)
{
if (id.HasValue && id.Value > 0)
{
return await _dbContext.Players.AnyAsync(t => t.Name == name && t.TeamId == teamId && t.Id != id);
}

return await _dbContext.Players.AnyAsync(t => t.Name == name && t.TeamId == teamId);
}

public async Task GetPlayersWithCurrentCost()
{
List pwcc = new List();

pwcc = await _dbContext.Players.Include(p => p.PlayersSeasonsCost)
.ThenInclude(psc => psc.Season)
.Where(p => p.Active == true)
.Select(p => new PlayerWithCurrentCostVM
{
Player = p,
Name = p.Name,
Cost = p.PlayersSeasonsCost == null ? 0 : p.PlayersSeasonsCost.Where(psc => psc.Season.Active == true).First().Cost
})
.AsNoTracking()
.ToListAsync();

return pwcc;
}

}
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... r-navigate
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»