gpt4 book ai didi

entity-framework - 我需要在 savechangesasync 方法中发送 "userid"

转载 作者:行者123 更新时间:2023-12-02 16:57:15 31 4
gpt4 key购买 nike

我正在实现审计表并覆盖 savechangesasync,但我需要检索用户标识,但我无法访问上下文类中的 HttpContextAccessor,因为它在解决方案的另一个项目中,我想将其作为savechangesasync 中的参数。我有两个表:Person{id,name,phone} 和 audittable{id,keys,oldvalues,newvalues,date,userid}。

我的解决方案有两个我的 Controller 所在的网络项目,以及一个上下文和模型类所在的数据项目。我像这样覆盖 savechangesasync:

   public override async Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default(CancellationToken))
{
var auditEntries = OnBeforeSaveChanges();
var result = await base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
await OnAfterSaveChanges(auditEntries);
return result;
}

等待 _context.saveChangesAsync(userid)或者还有其他更好的方法吗?谢谢

最佳答案

此接口(interface)位于您的数据项目中:

public interface IUserIdProvider
{
int UserId { get; }
}

此实现位于您的 Web 项目中:

public class UserIdProvider : IUserIdProvider
{
private readonly IHttpContextAccessor _contextAccessor;

public UserIdProvider(IHttpContextAccessor contextAccessor)
{
_contextAccessor = contextAccessor;
}

public int UserId
{
get
{
var nameId = _contextAccessor.HttpContext.User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier);
return nameId != null ? int.Parse(nameId.Value) : -1;
}
}
}

我假设您在 Web 项目中注册了您的服务:

services.AddScoped<IUserIdProvider, UserIdProvider>();

然后在您的 DbContext 中,注入(inject) IUserIdProvider:

public partial class MyDbContext
{
private IUserIdProvider _userIdProvider;

public MyDbContext(DbContextOptions<MyDbContext> options, IUserIdProvider userIdProvider) : base(options)
{
_userIdProvider = userIdProvider;
}

public override async Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default(CancellationToken))
{
//do you what you need with _userIdProvider here
var result = await base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
return result;
}
}

关于entity-framework - 我需要在 savechangesasync 方法中发送 "userid",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55958352/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com