Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 我需要发送;用户ID“;在savechangesasync方法中_Entity Framework_Api_Asp.net Core - Fatal编程技术网

Entity framework 我需要发送;用户ID“;在savechangesasync方法中

Entity framework 我需要发送;用户ID“;在savechangesasync方法中,entity-framework,api,asp.net-core,Entity Framework,Api,Asp.net Core,我正在实现一个审计表,我覆盖了savechangesasync,但我需要检索userid,但我无法访问上下文类中的HttpContextAccessor,因为它位于解决方案中的另一个项目中,我想将其作为savechangesasync中的参数发送。我有两个表: Person{id,name,phone}和audittable{id,key,oldvalues,newvalues,date,userid} 我的解决方案有两个项目,其中一个是web控制器,另一个是数据项目,其中包含上下文和模型类别。

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

我的解决方案有两个项目,其中一个是web控制器,另一个是数据项目,其中包含上下文和模型类别。 我覆盖SaveChangesSync,如下所示:

   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;
    }
public override异步任务savechangesync(bool acceptAllChangesOnSuccess,CancellationToken CancellationToken=default(CancellationToken))
{
var auditEntries=OnBeforeSaveChanges();
var result=await base.savechangesync(acceptAllChangesOnSuccess,cancellationToken);
在保存更改后等待(审核条目);
返回结果;
}
wait_context.saveChangesAsync(userid)
或者还有其他更好的方法吗?谢谢

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

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;
        }
    }
}
services.AddScoped<IUserIdProvider, UserIdProvider>();
我假设您在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;
        }
    }
}
services.AddScoped<IUserIdProvider, UserIdProvider>();

你为什么不能注入HttpContextAccesser?@ZatchMichael真棒!“你能把我的帖子标记为答案吗?”@ZatchMichael别担心,你会成功的。老实说,我实际上是从比我更有经验的开发人员那里学到了这个答案哈哈。我也不知道怎么做:P