在 EF6 中使用 LinQ 审计实体读取的最佳方法是什么?
What is the best way to audit reading of entities with LinQ in EF6?
我有一个代码优先的 EF 数据库设置,可以从前端使用 OData 控制器进行访问。
我正在尝试审核用户加载的实体。
如何在 LinQ 执行后拦截物化实体?
例如:
var entity = _service.Queryable().FirstOrDefault(x => x.ID == key);
我想在实体具体化并可以访问实体后添加自定义操作。
我尝试使用 DbContext.Database.Log,但我只得到 EF 生成的查询。
解决方法其实很简单。
因为我只想记录来自前端的用户请求,所以我扩展了 OData 控制器以在请求实体时添加审计日志。
这样无论在后台做什么LinQ过滤,我都可以访问到用户请求的结果:
var entity = _service.Queryable().Where(x => x.ID == key);
Logger.AddAuditLog(entity);
//... continue execution
希望这对某人有所帮助!
这是使用 ObjectMaterialized
事件
的一种方法
using (var context = new EntityContext())
{
// could be set globally in the constructor
var materialized = new List<object>();
((IObjectContextAdapter) context).ObjectContext.ObjectMaterialized += (sender, args) => materialized.Add(args.Entity);
var list = context.Customers.ToList();
FiddleHelper.WriteTable(materialized);
}
我有一个代码优先的 EF 数据库设置,可以从前端使用 OData 控制器进行访问。
我正在尝试审核用户加载的实体。
如何在 LinQ 执行后拦截物化实体?
例如:
var entity = _service.Queryable().FirstOrDefault(x => x.ID == key);
我想在实体具体化并可以访问实体后添加自定义操作。
我尝试使用 DbContext.Database.Log,但我只得到 EF 生成的查询。
解决方法其实很简单。
因为我只想记录来自前端的用户请求,所以我扩展了 OData 控制器以在请求实体时添加审计日志。
这样无论在后台做什么LinQ过滤,我都可以访问到用户请求的结果:
var entity = _service.Queryable().Where(x => x.ID == key);
Logger.AddAuditLog(entity);
//... continue execution
希望这对某人有所帮助!
这是使用 ObjectMaterialized
事件
using (var context = new EntityContext())
{
// could be set globally in the constructor
var materialized = new List<object>();
((IObjectContextAdapter) context).ObjectContext.ObjectMaterialized += (sender, args) => materialized.Add(args.Entity);
var list = context.Customers.ToList();
FiddleHelper.WriteTable(materialized);
}