【发布时间】:2021-01-31 21:03:25
【问题描述】:
我对这个和 Blazor 的新手感到迷茫并尝试学习它 (.NET 5)
我有一个简单的模型:
public class Status
{
[Key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
public DateTime CreatedOn { get; set; }
public DateTime LastUpdatedOn { get; set; }
}
在Startup.cs,我注册了我的数据库和服务。
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("Default")),(ServiceLifetime.Scoped));
services.AddAutoMapper(typeof(Startup));
services.AddScoped<IStatusRepo, StatusRepo>();
services.AddScoped<IStatusService, StatusService>();
我的组件的代码隐藏文件如下。 GetStatus 调用返回的 dto 与更新状态服务方法接受的不同,因此我将其转换为 UpdateStatus 方法。
public partial class EditStatus : ComponentBase
{
[Parameter]
public int StatusId { get; set; }
[Inject]
IStatusService StatusService { get; set; }
[Inject]
NavigationManager navigationManager { get; set; }
public bool ShowLoadError { get; set; } = false;
private StatusDetailDto StatusToEdit { get; set; } = new StatusDetailDto();
protected override async Task OnInitializedAsync()
{
await GetStatusToEdit(StatusId);
}
public async Task GetStatusToEdit(int statusId)
{
try
{
StatusToEdit = await StatusService.GetStatusById(statusId);
}
catch (Exception ex)
{
ShowLoadError = true;
}
}
protected async void UpdateStatus()
{
UpdateStatusDto updatedStatus = new UpdateStatusDto();
updatedStatus.Id = StatusToEdit.Id;
updatedStatus.Name = StatusToEdit.Name;
StatusDetailDto statusUpdated = await StatusService.UpdateStatus(updatedStatus);
if (statusUpdated != null)
{
navigationManager.NavigateTo("status/manage");
}
else
{
Console.WriteLine("No here");
}
}
}
服务层是:
public async Task<StatusDetailDto> UpdateStatus(UpdateStatusDto statusDto)
{
Status statusToUpdate = mapper.Map<UpdateStatusDto, Status>(statusDto);
Status updatedStatus = await statusRepo.UpdateStatus(statusToUpdate);
return mapper.Map<Status, StatusDetailDto>(updatedStatus);
}
还有回购
public async Task<Status> UpdateStatus(Status Status)
{
if (Status is null)
throw new ArgumentNullException("Nulls are not allowed.");
try
{
Status.LastUpdatedOn = DateTime.Now;
// THIS LINE THROWS THE ERROR!
_dbContext.Entry(Status).State = EntityState.Modified;
await _dbContext.SaveChangesAsync();
return Status;
}
catch (Exception)
{
throw;
}
}
也许我的服务生命周期有误?我也为我的dbcontext 尝试过短暂的生命周期。什么会引发此错误?
无法跟踪实体类型“Status”的实例,因为已经在跟踪具有相同键值 {'Id'} 的另一个实例。
【问题讨论】:
标签: c# asp.net-core .net-core entity-framework-core blazor-server-side