簡體   English   中英

Linq-to-SQL數據庫DataContext似乎自動填充表

[英]Linq-to-SQL Database DataContext seems to populate table automatically

我這里有一個看似奇怪的問題。 我是Linq-to-SQL的新手,所以我可能缺少明顯的東西。

我有一個DataContext dbml,它代表數據庫中的表,而這些表之一代表了一個日志表,該表累積了許多記錄。 簡單地將此表添加到dbml似乎會將數據庫中的每條記錄填充到DataContext對象中(因此也是我的viewmodel,因為datacontext是viewmodel的成員)。

在將視圖模型序列化為XML並注意到視圖模型中包含的數據的文件大小相當大之前,我從未注意到這一點。

打開XML會發現存在該表中的每個日志記錄,盡管除了Linq-to-SQL數據上下文對象的初始化(未引用表)之外,其他地方均未引用該記錄。

我還沒有檢查其他表是否在做同樣的事情(由於該項目和數據庫仍然是新的,所以其他表很小),但是日志表占序列化文件大小的80%。

這也令人擔憂,因為正在查詢它並將其存儲在內存中,這使我失去了額外的性能。 一旦使用該軟件並且數據庫快速增長,這將是一個大問題。

關於如何防止Linq-to-SQL提取每條記錄的任何想法? 謝謝。

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。 因此,此操作將從數據庫中提取所有數據。

在處理IQueryable時,有很多副作用,使用前應了解這些副作用。 在這種情況下,您可能會發現自己序列化了整個數據庫,或者通過循環使用IQueryable而不是一次將數據拉入內存並在其中進行處理,就可以DDOS數據庫服務器。

您的情況的解決方案是不序列化上下文。 可以先將其無效,也可以使用不應序列化的屬性對其進行標記。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM