Применить глобальные фильтры запросов на объектах
Реализовать «Изменено по логике», где идентификатор пользователя обновляется на запись после каждой записи. < /li>
< /ol>
Был изменение в HC15 в То, как DI Scope и EF Регистрация теперь сделана. Я подозреваю, что это является основной причиной. Я могу исправить ошибку, но для этого мне нужно удалить 1) и 2) выше, чего я действительно хотел бы избежать. < /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 на вершине EF Core. Модель и схема отображаются в GraphQL Nitro Explorer.public partial class Query
{
public IQueryable GetAnimals(DataContext ctx)
=> ctx.Animals;
}
< /code>
query {
animals {
id
}
}
< /code>
выполнение этого запроса теперь приводит к ошибке < /p>
{"Ошибки": [
{"Сообщение ":" Неожиданная ошибка выполнения ",
" Локации ": [{" Line ": 2," Column ": 3}],
path": [" животные »] }], "data": null}
Согласно официальной документации HC, способ проникновения EF Core изменилось
builder.Services.AddDbContextFactory(opt =>
{
string dbPath = builder.Configuration.GetRequiredValue("dbPath");
opt.UseSqlite($"Data Source={dbPath}");
});
//...
builder.Services.AddGraphQLServer().RegisterDbContextFactory();
< /code>
Выполнение того же запроса, затем приводит к этой ошибке < /p>
{"Ошибки":
[{«Сообщение»: «Неожиданная ошибка выполнения»,
«Локации»: [{{"Line": 2, "Column": 3}], "path": ["Животные"], "расширения": {"Сообщение": "не может разрешить Scoped Service 'IRequestIdentity' от root Provider.", "Stacktrace": "..."}], "Data": null}
< /blockquote>
afaik, dbcontextfactory < /code>-синглтон, в котором я пытаюсь получить Scoped-Service что не работает. Там я также пытался с заводским подходом, который выложен в документации: < /p>
public partial class Query
{
public IQueryable GetAnimalsWithFactory(IDbContextFactory ctxFactory)
=> ctxFactory.CreateDbContext().Animals;
}
==> Если я удалю IRequestidentity из dbset ctor , оба запроса возвращаются успешно. Но я теряю свои требования 1) и 2) выше. В то время как я мог компенсировать 1), просто добавив дополнительный. Где () фильтры в запрос, я понятия не имею, как я мог бы объяснить 2), не вводя что -то в DBSet < /code>.
У вас есть идея о том, как я могу заставить эту работу? Ваши мысли об этом и любые отзывы действительно ценится!
Подробнее здесь: https://stackoverflow.com/questions/794 ... resolve-sc