在 EntityFramework Core 的 DBContext 中使用可覆盖方法进行模拟

问题描述

我们有一个旧的 WinForms 软件,我们希望将其迁移到 Asp.Net-Core。旧数据库需要 ActiveDirectory 用户的最终用户访问。我们的 Asp.Net-Core 应用使用 AppPool-User 运行,但数据库访问需要模拟用户上下文。

我只想执行模拟的数据库调用

如果我想在 sql 发送到服务器之前钩住我的自定义代码,我必须在 EF-Core 的 DBContext 类中覆盖哪种方法

我对操纵内部 ChangeTracking 的钩子不感兴趣。

解决方法

如果您使用的是 EF Core 3.0+,则可以使用 Interceptors。但是请记住,只有关系数据库提供程序才支持数据库拦截器。它们使您可以访问典型的 db 命令操作,包括连接和事务管理。

您可以TAG 您的查询以便在拦截器逻辑中轻松识别它们。您会在 Interceptors 页面中找到很好的示例。

,

覆盖 Save 本身对您有用吗?

public class MyContext : DbContext
{
  public override int SaveChanges()
    {
      RunInpersonated();
      return base.SaveChanges();
    }
}

编辑:现在我又想起来了,那只是写访问,而不是读,你可能两者都需要。

您还可以实现存储库模式,并在那里添加您的模拟逻辑。当您在 IQueriable 上执行 ToListAsync() 等方法并获取结果时,用于读取查询的 SQL 实际上会发送到数据库。你可以编写你自己的扩展方法,比如 ToList,在那里添加你的模拟内容,然后调用普通的 ToList 方法。