Применить глобальные фильтры запросов на объектах < /li>
Реализовать «Измененную» логику, где идентификатор пользователя обновляется на запись после каждой записи. на пути DI-Scope и EF-регистрация теперь выполняются. Я подозреваю, что это является основной причиной. Я могу исправить ошибку, но для этого мне нужно удалить 1) и 2) выше, что я действительно хотел бы Aovid. < /P>
Вот мои рассуждения и то, что я сделал до сих пор: < /p>
Вот соответствующие службы и регистрация DI < /p>
Код: Выделить всё
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>
И это моя модель данных EF Core. Обратите внимание на поведение в 1) в методах SaveChanges
Код: Выделить всё
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>
Вот Hot Chocolate GraphQL Layer Ontop EF. Модель и схема отображаются в GraphQL Nitro Explorer.public partial class Query
{
public IQueryable GetAnimals(DataContext ctx) => ctx.Animals;
}
< /code>
query {
animals {
id
}
}
< /code>
Выполнение этого запроса теперь приводит к ошибке {«ошибки»: [{«Сообщение»: «Неожиданная ошибка выполнения», «Локации»: [{"Line": 2, "столбец ": 3}]," path ": [" Animals "]}]," data ": null}
Код: Выделить всё
builder.Services.AddDbContextFactory(opt =>
{
string dbPath = builder.Configuration.GetRequiredValue("dbPath");
opt.UseSqlite($"Data Source={dbPath}");
});
//...
builder.Services.AddGraphQLServer().RegisterDbContextFactory();
< /code>
Выполнение той же верности, а затем дает эту ошибку {«ошибки»: [{«Сообщение»: «Неожиданная ошибка выполнения», «Локации»: [{"line": 2, "столбец" : 3}], «Путь»: ["Животные"], "Расширения": {"Сообщение": "не может разрешить Scoped Service 'IRequestIdentity' от root Provider.", "Stacktrace": "..."}}], "data": null}
У вас есть идея, как я могу заставить эту работу? Ваши мысли об этом и любые отзывы действительно ценится!
Подробнее здесь: https://stackoverflow.com/questions/794 ... lve-scoped