【发布时间】:2021-07-21 13:11:59
【问题描述】:
父母和孩子都必须访问数据库上下文才能获取他们的特定数据,下面是他们的代码。
家长:
[Inject]
private IProductsService ProductService { get; set; }
private IEnumerable<ProductModel> ProdList;
private bool FiltersAreVisible = false;
protected override async Task OnInitializedAsync()
{
ProdList = await ProductService.GetObjects(null);
}
孩子:
[Parameter]
public IEnumerable<ProductModel> ProdList { get; set; }
[Parameter]
public EventCallback<IEnumerable<ProductModel>> ProdListChanged { get; set; }
[Inject]
private IRepositoryService<ProdBusinessAreaModel> ProdBAreasService { get; set; }
[Inject]
private IRepositoryService<ProdRangeModel> ProdRangesService { get; set; }
[Inject]
private IRepositoryService<ProdTypeModel> ProdTypesService { get; set; }
[Inject]
private IProductsService ProductService { get; set; }
private ProductFilterModel Filter { get; set; } = new ProductFilterModel();
private EditContext EditContext;
private IEnumerable<ProdBusinessAreaModel> ProdBAreas;
private IEnumerable<ProdRangeModel> ProdRanges;
private IEnumerable<ProdTypeModel> ProdTypes;
protected override async Task OnInitializedAsync()
{
EditContext = new EditContext(Filter);
EditContext.OnFieldChanged += OnFieldChanged;
ProdBAreas = await ProdBAreasService.GetObjects();
ProdRanges = await ProdRangesService.GetObjects();
ProdTypes = await ProdTypesService.GetObjects();
}
这会引发以下异常:InvalidOperationException: A second operation was started on this context before a previous operation completed. This is usually caused by different threads concurrently using the same instance of DbContext.
使用断点我看到父级运行OnInitializedAsync,当到达ProdList = await ProductService.GetObjects(null); 时立即跳转到子级OnInitializedAsync。
我通过从父级发出所有请求然后传递给子级来解决它,但我想知道是否有更好的方法来做到这一点,让子级能够获取自己的数据,当然也不会使数据库上下文瞬态。 .
问候
【问题讨论】:
-
您是如何注册服务的?它们是否以某种方式限定范围?
-
我的服务都是范围的
-
这可能非常浪费并导致问题。祝你好运。
-
@HenkHolterman 所有这些服务都通过依赖注入访问数据库上下文,因此它们不能设置为 sigleton,大多数是 Scoped
-
单例对于 DbContext 来说是非常糟糕的。 Scoped 在 Blazor 中效果不太好,但您可以尝试。请注意,瞬态服务是最容易使用的,你不能对它们做任何错事。
标签: blazor parent-child dbcontext database-concurrency