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