2015-09-25 2 views
0

У меня, кажется, странная проблема. Я новичок в Linq-to-SQL, поэтому мне может не хватать чего-то очевидного.База данных Linq-to-SQL DataContext, похоже, автоматически заполняет таблицу

У меня есть DataContext dbml, представляющий таблицы в моей базе данных, и одна из этих таблиц представляет таблицу журналов, которая накапливает много записей. Просто добавление этой таблицы в dbml, похоже, заполняет каждую запись из базы данных в объект DataContext (и, следовательно, мою модель просмотра, поскольку datacontext является членом модели viewmodel).

Я никогда не замечал этого, пока не сериализовал viewmodel в XML и заметил, что размер файла был довольно большим для данных, содержащихся в viewmodel.

Открытие XML показало, что каждая запись журнала из этой таблицы присутствовала, несмотря на то, что не упоминалась нигде, кроме инициализации объекта datacontext Linq-to-SQL (таблица не упоминается).

Я еще не проверял, делают ли другие таблицы одно и то же (другие таблицы очень малы, так как этот проект и база данных все еще новы), но таблица журналов выделялась как 80% размера сериализованного файла ,

Это также вызывает беспокойство, так как оно запрашивается и хранится в памяти, что требует дополнительной производительности. Это будет большой проблемой, когда программное обеспечение будет использоваться, и база данных будет расти с большой скоростью.

Любые идеи о том, как предотвратить использование Linq-to-SQL в каждой записи? Благодарю.

+1

Почему DataContext в ViewModel? Если вы его сериализуете, он будет сериализовать каждого публичного участника, включая каждую таблицу. Вы никогда не должны помещать DataContext в ViewModel. –

ответ

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, о которых вы должны знать, прежде чем использовать их. Вы могли бы сериализовать всю базу данных, как в этом случае, или вы могли бы использовать DDOS-сервер вашего db, работая с IQueryable в цикле, вместо того, чтобы извлекать данные в память один раз и работать над ним там.

Решение в вашем случае не является сериализацией контекста. Либо обнулите его, либо отметьте его атрибутом, который не должен быть сериализован.

+0

Сам DataContext не задан как свойство и не должен быть сериализован. Тем не менее, моя viewmodel содержит некоторые модели подвариантов, которые имеют свойства, которые ** получают ** их данные из Linq-to-SQL DataContext. Например, мои основные свойства ViewModel - это что-то вроде: public int ID {get {return id; } set {id = значение; ** DataContext **. Id = значение; }}, но некоторые из подвариантных моделей имеют такие свойства, как: public string X {get {return ** DataContext ** .X; } set {** DataContext **. X = значение; }}. Могут ли геттеры в этих свойствах sub-viewmodel быть причиной проблемы? – user5269172

+0

@ user5269172 Сериализатор удерживает объект, который можно проследить до контекста с помощью общедоступных ссылок. – Will

+0

Благодарим за быстрое обновление. Неправильно ли в MVVM использовать getters ссылки на значения таблицы DataContext Linq-to-SQL в отличие от локальных полей? Некоторые из моих моделей - «обертки» вокруг объектов таблицы DataContext, для дальнейшей настройки и вычисленных значений. – user5269172

Смежные вопросы