Linq-to-SQL数据库DataContext似乎自动填充表

本文关键字:填充 数据库 DataContext Linq-to-SQL | 更新日期: 2023-09-27 18:14:36

我这里有一个看似奇怪的问题。我是Linq-to-SQL的新手,所以我可能错过了一些明显的东西。

我有一个DataContext dbml代表我的数据库中的表,其中一个表代表一个日志表,它积累了大量的记录。只需将该表添加到dbml中,就可以将数据库中的每条记录填充到DataContext对象中(因此也填充到我的视图模型中,因为数据上下文是视图模型的成员)。

我从未注意到这一点,直到我将视图模型序列化为XML,并注意到视图模型中包含的数据的文件大小相当大。

打开XML显示这个表中的每一条日志记录都存在,尽管除了Linq-to-SQL数据上下文对象的初始化(表没有被引用)之外没有被引用到任何地方。

我还没有检查其他表是否也在做同样的事情(其他表非常小,因为这个项目和数据库仍然是新的),但是日志表突出为序列化文件大小的80%。

这也是令人担忧的,因为它被查询并存储在内存中,这会消耗我额外的性能。这将是一个大问题,一旦软件在使用和数据库以很大的速度增长。

关于如何防止Linq-to-SQL在每条记录拉的任何想法?谢谢。

Linq-to-SQL数据库DataContext似乎自动填充表

Linq to Sql严重依赖延迟执行。因此,虽然DataContext可能具有,例如,Logs属性,但它并不包含来自数据库的所有日志记录。

你可以与属性交互,但是仍然并不一定意味着发生了什么。

var myLogs = context.logs.Where(x => x.UserName = "lol");

这个仍然没有做任何事情。Linq to Sql使用IQueryables来定义您希望从数据库中获得的内容,而无需实际主动获取它们。只有当你对IQueryable做一些事情时,结果才会从数据库返回。

foreach(var log in myLogs) Console.WriteLine(log);

那么,这和你的情况有什么关系呢?你看,序列化器对此一无所知。它只看到一个带有一堆属性的对象。

因此,当它序列化对象时,它枚举属性值并将它们写入xml。因此,此操作将从数据库中取出所有数据。

在处理IQueryables时,有很多副作用,你应该在使用它们之前意识到。您可能会发现自己序列化了整个数据库,就像在这种情况下一样,或者您可能会通过在循环中使用IQueryable而不是将数据一次性拉入内存并在那里处理它来DDOS您的数据库服务器。

在您的情况下,解决方案是不序列化上下文。要么先将其空掉,要么用不应该序列化的属性标记它。