Я разрабатываю веб-приложение 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
DbContext удаляется после навигации. ⇐ C#
Место общения программистов C#
1773035074
Anonymous
Я разрабатываю веб-приложение blazor и сталкиваюсь со странным поведением. Почти все страницы представляют собой копирование/вставку, на них есть операции CRUD и предыдущий список различных элементов (сезоны, игроки, матчи и т. д.), но только с одной из них у меня возникают проблемы. Когда я нажимаю кнопку «Редактировать» проигрывателя, я получаю сообщение «Невозможно получить доступ к удаленному объекту», относящееся к _dbContext.
Добавив точку останова к методу DisposeAsync(), я обнаружил, что он запускается, когда я перехожу на страницу редактирования. Но это происходит только на странице игрока, а не на других страницах.
Вот страница игрока:
@page "/players"
@attribute [Authorize]
@using Models = Biwenger.Models
@using Biwenger.Services
@inject PlayersService service;
@inject NavigationManager navigationManager;
Jugadores
[url=/player]Añadir[/url]
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;
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79106883/dbcontext-is-disposed-after-navigate[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия