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

C# Linq to SQL数据库DataContext似乎自动填充表,c#,sql,visual-studio,mvvm,linq-to-sql,C#,Sql,Visual Studio,Mvvm,Linq To Sql,我这里有一个似乎很奇怪的问题。我是LinqtoSQL的新手,所以我可能遗漏了一些明显的东西 我有一个DataContext dbml,表示数据库中的表,其中一个表表示一个日志表,它积累了大量记录。简单地将该表添加到dbml中,似乎就可以将数据库中的每条记录填充到DataContext对象中(因此也填充到我的viewmodel中,因为DataContext是viewmodel的一个成员) 我从未注意到这一点,直到我将viewmodel序列化为XML,并注意到viewmodel中包含的数据的文件大小

我这里有一个似乎很奇怪的问题。我是LinqtoSQL的新手,所以我可能遗漏了一些明显的东西

我有一个DataContext dbml,表示数据库中的表,其中一个表表示一个日志表,它积累了大量记录。简单地将该表添加到dbml中,似乎就可以将数据库中的每条记录填充到DataContext对象中(因此也填充到我的viewmodel中,因为DataContext是viewmodel的一个成员)

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

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

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

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


关于如何防止LINQtoSQL拉入每条记录,有什么想法吗?谢谢。

Linq to Sql严重依赖延迟执行。因此,尽管DataContext可能有一个Logs属性,但它并不包含数据库中的所有日志记录

foreach(var log in myLogs) Console.WriteLine(log);
您可以与属性交互,但这并不一定意味着发生了任何事情

var myLogs = context.logs.Where(x => x.UserName = "lol");
这仍然没有起到任何作用。LINQtoSQL使用IQueryables定义您希望从数据库中获取的内容,而无需主动获取它们。只有在对IQueryable执行某些操作时,才会从数据库返回结果

foreach(var log in myLogs) Console.WriteLine(log);
那么,这和你的处境有什么关系?你看,连载器不知道杰克这件事。它只看到一个具有一系列属性的对象

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

在处理iquiryables时,有很多副作用,在使用它们之前应该注意这些副作用。您可能会发现自己正在序列化整个数据库,就像在本例中一样,或者您可能会通过在循环中使用IQueryable而不是将数据拉入内存并在那里进行操作来DDOS您的db服务器


您的解决方案不是序列化上下文。要么在前面将其置空,要么用不应序列化的属性将其标记。

为什么DataContext在ViewModel中?如果序列化它,它将序列化包括每个表在内的每个公共成员。决不应将DataContext放在ViewModel中。DataContext本身未设置为属性,因此不应序列化。但是,my viewmodel包含一些子viewmodel,这些子viewmodel具有从Linq到SQL DataContext获取数据的属性。例如,我的主ViewModel的属性类似于:public int ID{get{return ID;}set{ID=value;DataContext.ID=value;}}},但一些子ViewModel的属性是:public string X{get{return DataContext.X;}set{DataContext.X=value;}。这些子viewmodel属性上的getter可能是问题的根源吗?@user5269172序列化程序获得了一个对象,该对象可以通过公开可用的引用追溯到上下文。感谢您的快速更新,在MVVM中,让getter引用Linq到SQL DataContext表值而不是本地字段是否是一种不好的做法?我的一些模型是围绕DataContext表对象的“包装器”,用于进一步的自定义和计算值。@user5269172不一定是坏的,除非您面临这样的问题。我不喜欢这样的ORM,因为您必须担心来回映射到实体。大量浪费的扑翼:/