我试图弄清楚如何使用Entity Framework Cores 2.1新的ChangeTracker.Tracked事件来吸引阅读查询。不幸的是,我无法理解如何实现这一点。
由于这是一项新功能,因此无法在其上找到任何文章,并且Microsoft官方docs网站未提供任何帮助或示例代码。
我的情况很简单。我有一个包含以下各列的数据库:
id,customerId,元数据。
当用户查询该表时,我想截取查询结果集,并且对于每一行,我想将customerId与当前登录的用户进行比较。
我希望ChangeTracker.Tracked事件可以帮助我拦截返回结果集。我正在寻找有关如何实现上述目标的一些示例代码。
最佳答案
这是ChangeTracker.Tracked
事件的示例用法。
将以下方法添加到您的上下文中(需要using Microsoft.EntityFrameworkCore.ChangeTracking;
):
void OnEntityTracked(object sender, EntityTrackedEventArgs e)
{
if (e.FromQuery && e.Entry.Entity is YourEntityClass)
{
var entity = (YourEntityClass)e.Entry.Entity;
bool isCurrentUser = entity.customerId == CurrentUserId;
// do something (not sure what)
}
}
并将其附加到
ChangeTracker.Tracked
甚至在您的上下文构造函数中:ChangeTracker.Tracked += OnEntityTracked;
如
Tracked
事件documentation中所述:上下文跟踪实体时触发的事件,可能是因为它是从跟踪查询返回的,还是因为它已附加或添加到上下文中。
一些事情要提。
没有为no-tracking queries触发该事件
将为由跟踪查询结果集创建但尚未由上下文跟踪的每个实体实例触发该事件
事件args的
bool FromQuery
属性用于区分是从跟踪查询实现过程中触发事件还是通过用户代码(Attach
,Add
等调用)触发事件。事件args的
EntityEntry Entry
属性使您可以访问实体实例和其他相关信息(与调用非通用DbContext.Entry
方法时获得的信息基本相同)