我正在探索实体框架7,我想知道是否有办法拦截" SELECT"查询。每次创建,更新或删除实体时,我都会使用当前日期和时间标记实体。
SELECT *
FROM MyTable
WHERE DeletedOn IS NOT NULL
我希望所有SELECT查询都排除已删除的数据(请参阅上面的WHERE子句)。有没有办法使用Entity Framework 7?
答案 0 :(得分:3)
我不确定您的底层基础架构是什么样的,以及您的应用程序和实体框架之间是否有任何抽象。假设您正在使用DbSet<T>
,您可以编写一个扩展方法来排除已删除的数据。
public class BaseEntity
{
public DateTime? DeletedOn { get; set; }
}
public static class EfExtensions
{
public static IQueryable<T> ExcludeDeleted<T>(this IDbSet<T> dbSet)
where T : BaseEntity
{
return dbSet.Where(e => e.DeletedOn == null);
}
}
//Usage
context.Set<BaseEntity>().ExcludeDeleted().Where(...additional where clause).
答案 1 :(得分:0)
我有一些相同的问题。我试图拦截读取查询,如; select,where etc以查看返回的结果集。在EF Core中,不幸的是,你没有相应的覆盖SaveChanges来读取查询。
但是,您仍然可以通过使用
将实体框架核心挂钩到commandExecuting和commandExecuted var listener = _context.GetService<DiagnosticSource>();
(listener as DiagnosticListener).SubscribeWithAdapter(new CommandListener());
并使用以下两种方法创建一个类
public class CommandListener
{
[DiagnosticName("Microsoft.EntityFrameworkCore.Database.Command.CommandExecuting")]
public void OnCommandExecuting(DbCommand command, DbCommandMethod executeMethod, Guid commandId, Guid connectionId, bool async, DateTimeOffset startTime)
{
//do stuff.
}
[DiagnosticName("Microsoft.EntityFrameworkCore.Database.Command.CommandExecuted")]
public void OnCommandExecuted(object result, bool async)
{
//do stuff.
}
}
然而,这些是高级别的lewel拦截器,因此您无法查看返回的结果集(在您的情况下使其无用)。
我建议两件事情,首先去实施&#34; Hooks的投票,以便在高层和低层动态拦截和修改查询&#34;在:https://data.uservoice.com/forums/72025-entity-framework-core-feature-suggestions/suggestions/1051569-hooks-to-intercept-and-modify-queries-on-the-fly-a
其次,您可以使用拦截器来使用PostSharp(商业产品); LocationInterceptionAspect on properties或OnMethodBoundaryAspect for methods。