我需要在savechangesasync方法中发送“ userid”

时间:2019-05-02 18:37:15

标签: entity-framework api asp.net-core

我正在实现一个审计表,并且我覆盖了savechangesasync,但是我需要检索用户ID,但是我无法访问我的上下文类中的HttpContextAccessor,因为它在解决方案的另一个项目中,我想将其作为savechangesasync中的参数。我有两个表: 人{id,名称,电话}和审计表{id,键,旧值,新值,日期,用户ID}。

我的解决方案有两个项目Web,其中我的控制器是,一个数据项目是上下文和模型的分类。 我这样覆盖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) 还是还有其他更好的方法?谢谢

1 个答案:

答案 0 :(得分:3)

此界面位于您的数据项目中:

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中注入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;
    }
}