EF Core -在dbcontext的所有成员上生成未过滤的查询



我在这里写这篇文章,希望有人以前有过这样的经历,并且对这个问题有一个彻底的答案。

我们有一个c# Web API来处理CRUD操作,其中我们使用EF Core作为ORM来操作数据。

通过检查SQL日志,我们可以看到有很多select语句没有被过滤(没有where子句)。这似乎不是来自代码库。

奇怪的是,一些被调用的表在代码中除了在DBContext本身上没有其他引用。

例如。

public class MyContext : DbContext{
public DbSet<MyDbSet> MyDBSet { get; set; }
}

这似乎会周期性地在表上输出一个select语句,即使代码中没有使用它。

SELECT [m].[Id], [m].[Column1], [m].[Column2]
FROM [MyDBSet] AS [m]

这样做的问题是,其中一些表有大量的数据,我希望避免对这些数据进行未经过滤的查询。

从进一步的检查来看,这些未过滤的查询出现的顺序似乎与它们在DBContext中出现的顺序相同。

示例2

public class MyContext : DbContext{
public DbSet<MyDbSet> MyDBSet { get; set; }
public DbSet<MyDbSet2> MyDBSet2 { get; set; }
public DbSet<MyDbSet3> MyDBSet3 { get; set; }
}
SELECT [m].[Id], [m].[Column1], [m].[Column2]
FROM [MyDBSet] AS [m]
SELECT [m].[Id], [m].[Column1], [m].[Column2]
FROM [MyDBSet2] AS [m]
SELECT [m].[Id], [m].[Column1], [m].[Column2]
FROM [MyDBSet3] AS [m]

即使没有在代码库中读取或引用表,并且没有对这些没有where子句的表的引用,也会发生这种情况。

我的第一个假设是EF core正在拍摄表的快照?也许是查询缓存或类似的东西?

我想我的问题是,有没有人知道是什么导致了这种奇怪的行为,或者是EF core中有什么东西负责。

注意-我们没有使用延迟加载代理包,而是在整个应用程序中使用即时加载

在仔细检查了系统的大量内存转储之后-导致报告的未过滤查询的包是Serilog。

https://github.com/RehanSaeed/Serilog.Exceptions

从这里你会发现以下关于Serilog异常版本的详细信息,似乎在版本8以下与EF core结合,导致Serilog试图解构实现IQueryable的值-在较新的版本中不会发生这种情况。

警告:在Serilog.Exceptions的版本早于8.0.0,如果你使用实体框架核心与Serilog.Exceptions你必须添加这个,否则在某些情况下,你的整个数据库将被记录!这是因为实体框架核心中的异常具有链接到其中的整个数据库模式的属性(参见#100,asp.net/EntityFrameworkCore#15214)。Serilog.Exceptions的新版本通过防止实现IQueryable的属性的解构来避免这个问题。

最新更新