Hallo zusammen,
ich bastel mir gerade eine Anwendung mit Blazor Server Side + EF Core zusammen.
Für den Datenzugriff habe ich mir eine Art RepositoryWrapper geschrieben, welcher per DI (Transient) in meine ViewModels injected wird.
Das Problem ist nun, dass ich Seiten, wo der RepositoryWrapper verwendet wird, nur einmal aufrufen kann, beim zweiten aufrufen stürzt es mit der Meldung "A second operation started on this context before a previous operation completed." ab.
In der Funktion
Ich bin auf dem Gebiet auch noch relativ neu.
Es gibt wohl noch die Möglichkeit
So sieht mein RepositoryWrapper aus:
Spoiler anzeigen
Und so mein
Spoiler anzeigen
Ich bin über jeden Rat dankbar
ich bastel mir gerade eine Anwendung mit Blazor Server Side + EF Core zusammen.
Für den Datenzugriff habe ich mir eine Art RepositoryWrapper geschrieben, welcher per DI (Transient) in meine ViewModels injected wird.
Das Problem ist nun, dass ich Seiten, wo der RepositoryWrapper verwendet wird, nur einmal aufrufen kann, beim zweiten aufrufen stürzt es mit der Meldung "A second operation started on this context before a previous operation completed." ab.
In der Funktion
AddDbContext
habe ich bereits ServiceLifetime.Scoped
angegeben, wie es auch in der Dokumentation von Microsoft beschrieben steht. Mein RepositoryWrapper selbst ist ebenfalls als Transient deklariert.Ich bin auf dem Gebiet auch noch relativ neu.
Es gibt wohl noch die Möglichkeit
OwningComponentBase
zu verwenden, aber das entfällt vermutlich bei mir, da meine ViewModels eben keine Components sind, sondern das ViewModel in die Components injected wird.So sieht mein RepositoryWrapper aus:
C#-Quellcode
- public class RepositoryWrapper
- {
- public IMitarbeiterRepository Mitarbeiter { get; private set; }
- public IGruppeRepository Gruppe { get; private set; }
- public IStempelstatusRepository Stempelstatus { get; private set; }
- public IZeitprofilRepository Zeitprofil { get; private set; }
- public IRolleRepository Rolle { get; private set; }
- public IRechteRepository Recht { get; private set; }
- public IStempelRepository Stempel { get; private set; }
- readonly ApplicationDbContext context;
- public RepositoryWrapper(ApplicationDbContext context)
- {
- this.context = context;
- Mitarbeiter = new MitarbeiterRepository(context);
- Gruppe = new GruppeRepository(context);
- Stempelstatus = new StempelstatusRepository(context);
- Zeitprofil = new ZeitprofilRepository(context);
- Rolle = new RolleRepository(context);
- Recht = new RechtRepository(context);
- Stempel = new StempelRepository(context);
- }
- public async Task SaveAsync()
- {
- await context.SaveChangesAsync();
- }
- }
Und so mein
AddDbContext
sowie die DI für den RepositoryWrapper:C#-Quellcode
- services.AddDbContext<ApplicationDbContext>(options =>
- {
- bool lokal = false;
- var connectionString = lokal
- ? Configuration.GetConnectionString("lokaleDb")
- : Configuration.GetConnectionString("remoteDb");
- options.UseSqlServer(connectionString);
- ILoggerFactory loggerFactory = LoggerFactory.Create(builder =>
- {
- builder
- .AddFilter((cat, level) => cat == DbLoggerCategory.Database.Command.Name && level == LogLevel.Information)
- .AddConsole();
- });
- options.UseLoggerFactory(loggerFactory);
- }, ServiceLifetime.Transient);
- services.AddTransient<RepositoryWrapper>();
Ich bin über jeden Rat dankbar