Je crée une application Blazor côté serveur. Le code suivant se trouve dans Startup.cs
.
services.AddDbContext<MyContext>(o => o.UseSqlServer(Configuration.GetConnectionString("MyContext")), ServiceLifetime.Transient);
services.AddTransient<MyViewModel, MyViewModel>();
Et dans le ViewModel:
public class MyViewModel : INotifyPropertyChanged
{
public MyViewModel(MyContext myContext)
{
_myContext = myContext;
}
public async Task<IEnumerable<Dto>> GetList(string s)
{
return await _myContext.Table1.where(....)....ToListAsync();
}
Et dans le fichier rasoir.
@inject ViewModels.MyViewModel VM
<input id="search" type="text" @bind="search" />
<input id="search" type="button" value="Go" @onclick="SearchChanged" />
@code {
string search = "";
int currentCount = 0;
async void SearchChanged() {
currentCount++;
dtos = GetList(search);
}
}
Cependant, parfois l'erreur suivante se produit lorsque vous cliquez sur le bouton de recherche?
System.InvalidOperationException: 'Une deuxième opération a démarré sur ce contexte avant la fin d'une opération précédente. Cela est généralement dû à différents threads utilisant la même instance de DbContext. Pour plus d'informations sur la façon d'éviter les problèmes de thread avec DbContext, voir https://go.microsoft.com/fwlink/?linkid=2097913 . '
Vous pouvez essayer de créer une nouvelle étendue pour chaque demande:
public class MyViewModel : INotifyPropertyChanged
{
protected readonly IServiceScopeFactory _ServiceScopeFactory;
public MyViewModel(IServiceScopeFactory serviceScopeFactory)
{
_ServiceScopeFactory = serviceScopeFactory;
}
public async Task<IEnumerable<Dto>> GetList(string s)
{
using (var scope = _ServiceScopeFactory.CreateScope())
{
var referenceContext = scope.ServiceProvider.GetService<MyContext>();
return await _myContext.Table1.where(....)....ToListAsync();
}
}
Ici Daniel Roth (Blazor Product Manager) parle de l' utilisation d'Entity Framework Core avec Blazor
Je résous le problème mais je pense que j'ai perdu l'unité de travail car maintenant j'ai plus d'un dbContex:
Constructeur:
private AppDbContext _db;
protected override void OnInitialized()
{
_db = new AppDbContext();
var query = _db.Set<Group>().AsQueryable();
}
et plus tard je m'en débarrasse:
public void Dispose()
{
_db?.Dispose();
}