c# - EF 查询有时会给出来自不同模式的结果集
问题描述
我正在开发一个在 C# REST API 中使用实体框架的遗留应用程序。它使用一个带有一个模式的 postgresql 数据库进行身份验证,每个组织都有自己的模式。有时在生产中,我们会收到有关人们看到来自另一个模式的数据的报告,有时部分是他们自己的部分来自另一个组织。
提前原谅我的语法错误。
该应用程序使用一个带有一个模式的 postgresql 数据库进行身份验证,每个组织都有自己的模式。
测试数据库
- Authentication_schema
- orgschema_x
- orgschema_y
- orgschema_z
组织模式构造函数的 dbcontext 需要一个参数,该参数是来自另一个上下文的用户组织,在我们的示例中可能是 x。
实体框架 EDMX 首先从第一个组织(所有组织具有相同的结构)基于数据库生成,并使用称为 Replace Schema Interceptor 的 System.Data.Entity.Infrastructure.Interception.IDbCommandInterceptor 的实现来修改架构名称,因此在实际发送之前修改发送到数据库的查询。
每个 CRUD 请求都会根据用户创建自己的上下文,并在调用后关闭连接。
遇到此问题的始终是同一用户,对于我们开发人员来说,我们永远无法重现此问题,但我们知道这是一个问题,因为我们在日志中看到用户在另一个模式中写入数据。
- 我们已经尝试记录查询以确保 replaceschemainterceptor 完成它的工作,并且它确实做到了。我们得到了错误数据的报告和屏幕截图,而日志中没有任何内容。
- 我们已经更改了每种方法,以确保它们每次调用时都创建一个新的 dbcontext。
- 我们禁用了代理创建和延迟加载。
我们目前没有想法,因为我们无法复制它,并且特定用户只有 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 倍,我们无法重现它。有没有人经历过类似的事情并可以将我们推向正确的方向?
对于任何需要的其他信息,请随时询问!:)
解决方案
推荐阅读
- php - grav cms : 包含 php 文件的树枝扩展
- python - 中心流光按钮
- javascript - 如何在 vanilla JavaScript 中切换多个类?
- android - 更新android studio 3.6后Databiding Unresolve参考
- javascript - 如何根据内部组件更改 props.data?
- android - setOnApplyWindowInsetsListener() 没有应用填充和调用 2 次
- reactjs - useEffect 优化,但当传递的数组发生变化时无法重新渲染
- http - 我可以在 Authorization 标头中同时使用 Basic 和 Bearer 吗?
- mysql - MySQL - 仅根据不同条件选择某些行
- java - 策略创建的 OpenAM 问题