繁体   English   中英

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

[英]Impersonation using an overwriteable method in DBContext of EntityFramework Core

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

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

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

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

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

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

Save 本身的覆盖会为您解决问题吗?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM