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

时间:2015-09-25 14:53:43

标签: c# sql visual-studio mvvm linq-to-sql

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

我有一个DataContext dbml表示我的数据库中的表,其中一个表表示一个累积大量记录的日志表。只需将此表添加到dbml,就会将数据库中的每条记录填充到DataContext对象中(因此我的viewmodel,因为datacontext是viewmodel的成员)。

在我将viewmodel序列化为XML并注意到viewmodel中包含的数据的文件大小相当大之前,我从未注意到这一点。

打开XML显示该表中的每个日志记录都存在,尽管除了Linq-to-SQL datacontext对象的初始化(未引用表)之外没有被引用。

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

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

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

1 个答案:

答案 0 :(得分:0)

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您的数据库服务器,而不是将数据拉入内存并在那里处理它。

您的案例中的解决方案不是序列化上下文。要么先将其清空,要么将其标记为不应序列化的属性。