Injizierter scoped Service in EF DBSet in Hotchocolat 15: Kann den Scoped -Service nicht vom Root -Anbieter behebenC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Injizierter scoped Service in EF DBSet in Hotchocolat 15: Kann den Scoped -Service nicht vom Root -Anbieter beheben

Post by Anonymous »

Ich habe kürzlich mein Backend GraphQL -Backend mit EF Core und Hotchocolat von Version 12.x.x bis 15.0.3 aktualisiert. Build/Start funktioniert gut. Ich habe jedoch Probleme beim Abfragen, da der Fehler unerwarteter Ausführungsfehler geworfen wird.
Bevor ich anfange >. Ich verwende einen Httpaccessor und extrahiere JWT -Informationen daraus und speichere sie in den Service irequestidentity . Dies wurde seitdem in den DBContext injiziert, wo ich zwei Dinge damit mache: < /p>

Wenden Sie globale Abfragebefilter auf die Entitäten an < /li>
Implementieren Sie eine "geändert durch" Logik, wobei die Benutzer -ID nach jedem Schreiben auf einen Datensatz aktualisiert wird. im Weg DI-SCOPE und EF-Registrierung sind jetzt abgeschlossen. Ich vermute, dass dies die Hauptursache ist. Ich kann den Fehler beheben, aber dafür muss ich 1) und 2) oben entfernen, was ich wirklich gerne aovid möchte. < /P>
Hier ist meine Argumentation und was ich bis jetzt getan habe: < /p>
Hier sind die relevanten Dienste und die DI-Registrierung < /p>

Code: Select all

public interface IUserResolverService
{
Guid GetUserId();
Guid GetTenantId();
}

public class UserResolverService(IHttpContextAccessor accessor) : IUserResolverService
{
public Guid GetUserId() => // ... get user id from token via accessor
public Guid GetTenantId() => // ...get tenant id from token via accessor
}

public interface IRequestIdentity
{
Guid TenantId { get; init; }
Guid UserId { get; init; }
}

public record RequestIdentity(Guid TenantId, Guid UserId) : IRequestIdentity;

builder.Services.AddScoped();
builder.Services.AddScoped(sp =>
{
var userResolverSvc = sp.GetRequiredService();
return new RequestIdentity(userResolverSvc.GetUserId(), userResolverSvc.GetTenantId());
});
builder.Services.AddDbContext(opt =>
{
string dbPath = builder.Configuration.GetRequiredValue("dbPath");
opt.UseSqlite($"Data Source={dbPath}");
});
< /code>
Und dies ist mein EF -Kerndatenmodell. Beachten Sie das Verhalten für 1) in den OnModelCreating 
und für 2) in den Savechanges -Methoden. Beachten Sie auch, dass ich Irequestidentity in den CTOR des DBSet injiziere.

Code: Select all

public record Animal
{
public Guid TenantId { get; set; }
public Guid ChangedBy { get; set; }
[MaxLength(50)] public string Name { get; set; }
}

public class DataContext : DbContext
{
public DbSet Animals { get; init; } = null!;
public readonly IRequestIdentity RequestIdentity;
public DataContext(DbContextOptions options, IRequestIdentity reqId) : base(options)
{
RequestIdentity = reqId;
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity(e =>
{
e.ToTable("Animals");
e.HasQueryFilter(a => a.TenantId == RequestIdentity.TenantId);
});
}

public override int SaveChanges(bool acceptAllChangesOnSuccess)
{
// updated ChangedBy property

return base.SaveChanges(acceptAllChangesOnSuccess);
}
}
< /code>
Hier ist die heiße Schokoladenschichtschicht auf EF. Das Modell und das Schema werden im GraphQL Nitro Explorer gut angezeigt.public partial class Query
{
public IQueryable GetAnimals(DataContext ctx) => ctx.Animals;
}
< /code>
query {
animals {
id
}
}
< /code>
Ausführen dieser Abfrage führt jetzt zum Fehler {"Fehler": [{"Nachricht": "Unerwarteter Ausführungsfehler", "Positionen": [{"Zeile": 2, "Spalte" ": 3}]," Pfad ": [" Tiere "]}]," Daten ": null} 
Gemäß der offiziellen HC -Dokumentation ist die Art und Weise, wie EF ist Wired Up hat sich geändert < /p>

Code: Select all

builder.Services.AddDbContextFactory(opt =>
{
string dbPath = builder.Configuration.GetRequiredValue("dbPath");
opt.UseSqlite($"Data Source={dbPath}");
});

//...

builder.Services.AddGraphQLServer().RegisterDbContextFactory();
< /code>
Die gleiche Ausführung derselben Quartal gibt diesen Fehler an.  : 3}], "Pfad": ["Animals"], "Erweiterungen": {"Nachricht": "Kann den Scoped Service 'irequestidentity' nicht von der Wurzel nicht beheben Anbieter. "," Stacktrace ":" ... "}}]," Daten ": null} 
afaik, der dbContextFactory ist ein Singelton, in dem ich es versuche, es zu Ableiten Sie den DCOPED-Service ab, der nicht funktioniert. Abfrage kehrt erfolgreich zurück. Aber ich verliere meine Anforderungen 1) und 2) oben. Während ich 1 ausgleichen könnte, indem ich nur zusätzliche .where () Filter in der Abfrage hinzufügen könnte, habe ich keine Ahnung, wie ich 2) ohne etwas auszurechnen könnte, ohne etwas in den DBSet zu injizieren. < /p>
Haben Sie eine Idee, wie ich diese zum Laufen bringen könnte? Ihre Gedanken dazu und jedes Feedback werden sehr geschätzt!

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post