首页 > 解决方案 > EF 查询有时会给出来自不同模式的结果集

问题描述

我正在开发一个在 C# REST API 中使用实体框架的遗留应用程序。它使用一个带有一个模式的 postgresql 数据库进行身份验证,每个组织都有自己的模式。有时在生产中,我们会收到有关人们看到来自另一个模式的数据的报告,有时部分是他们自己的部分来自另一个组织。

提前原谅我的语法错误。

该应用程序使用一个带有一个模式的 postgresql 数据库进行身份验证,每个组织都有自己的模式。

测试数据库

组织模式构造函数的 dbcontext 需要一个参数,该参数是来自另一个上下文的用户组织,在我们的示例中可能是 x。

实体框架 EDMX 首先从第一个组织(所有组织具有相同的结构)基于数据库生成,并使用称为 Replace Schema Interceptor 的 System.Data.Entity.Infrastructure.Interception.IDbCommandInterceptor 的实现来修改架构名称,因此在实际发送之前修改发送到数据库的查询。

每个 CRUD 请求都会根据用户创建自己的上下文,并在调用后关闭连接。

遇到此问题的始终是同一用户,对于我们开发人员来说,我们永远无法重现此问题,但我们知道这是一个问题,因为我们在日志中看到用户在另一个模式中写入数据。

我们目前没有想法,因为我们无法复制它,并且特定用户只有 100 次中的 1 次。

DBContext初始化和简单请求

using (var context = new dbEntities("orgschema_" + db.Organization))
{
      /** Any code from lists to single objects possible here */

      table1 data = context.table1.Where(x => x.name == testname).FirstOrDefault();
      return data;
}

用户的组织已在登录时设置。

具体的replaceschema拦截方法。它找到所有 orgschema_ 并替换它背后的组织。

private String ReplaceSchema(String sql)
{
 int index = sql.IndexOf("orgschema_");
 if (index == -1)
 {
  return sql;
 }
 String userStart = sql.Substring(index);

 int endIndex = userStart.IndexOf("\"");
 if (endIndex == -1)
 endIndex = userStart.IndexOf(".");

 String user = sql.Substring(index, endIndex);
 sql = sql.Replace(user, _newSchema);
 return sql;
}

在 dbContext 构造函数中执行以下代码。

public dbEntities(string sConnectionString) : base("name=dbEntities") 
{
         System.Data.Entity.Infrastructure.Interception.DbInterception.Add(new 
         ReplaceSchemaInterceptor(newSchema: sConnectionString));
}

我希望 API 始终从正确的组织返回数据。但它不是 100/100 倍,我们无法重现它。有没有人经历过类似的事情并可以将我们推向正确的方向?

对于任何需要的其他信息,请随时询问!:)

标签: c#postgresqlentity-framework-6

解决方案


推荐阅读