【问题标题】:Linq-to-SQL Database DataContext seems to populate table automaticallyLinq-to-SQL 数据库 DataContext 似乎自动填充表
【发布时间】:2015-12-23 10:48:24
【问题描述】:

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

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

直到我将 viewmodel 序列化为 XML 并注意到文件大小对于 viewmodel 中包含的数据来说相当大,我才注意到这一点。

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

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

这也令人担忧,因为它正在被查询并存储在内存中,从而降低了我的性能。一旦软件在使用中并且数据库以较大的速度增长,这将是一个大问题。

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

【问题讨论】:

  • 为什么ViewModel中有DataContext?如果你序列化它,它将序列化每个公共成员,包括每个表。您永远不应该将 DataContext 放在 ViewModel 中。

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


【解决方案1】:

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,而不是将数据一次拉入内存并在那里处理。

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

【讨论】:

  • DataContext 本身未设置为属性,因此不应序列化。但是,我的视图模型包含一些子视图模型,这些子视图模型具有从 Linq-to-SQL 数据上下文获取它们的数据的属性。例如,我的主要 ViewModel 的属性类似于: public int ID { get { return id; } 设置 { id = 值; DataContext.id = value; } },但一些子视图模型具有如下属性: public string X { get { return DataContext.X; } 设置 { DataContext.X = 值; } }。这些子视图模型属性上的 getter 是否会导致问题?
  • @user5269172 序列化程序拥有一个对象,该对象可以通过公开可用的引用追溯到上下文。
  • 感谢快速更新,在 MVVM 中让 getter 引用 Linq-to-SQL DataContext 表值而不是本地字段是不好的做法吗?我的一些模型是围绕 DataContext 表对象的“包装器”,用于进一步自定义和计算值。
  • @user5269172 不一定是坏事,除非你遇到这样的问题。我不喜欢这样的 ORM,因为您必须担心来回映射到实体。很多浪费的拍打:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
相关资源
最近更新 更多