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
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}
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}
Haben Sie eine Idee, wie ich diese zum Laufen bringen könnte? Ihre Gedanken dazu und jedes Feedback werden sehr geschätzt!