При использовании Linq2sql все работает автоматически. Мой опыт заключается в том, что переход с потоком не всегда является лучшим решением и лучше понять, как что-то внутренне работает, поэтому вы оптимально используете технику.
Итак, мой вопрос касается linq2sql.
Если я выполняю запрос и получаю некоторые объекты базы данных, или я создаю новый, каким-то образом объект linqcontext сохраняет ссылки на эти объекты. Если что-то меняется в одном из объектов, объект контекста "знает", что изменилось и нуждается в обновлении.
Если мои ссылки на объект равны нулю, означает ли это, что объект контекста также удаляет ссылку на этот объект? Или объект контекста медленно заполняется множеством ссылок и сохраняет объекты базы данных от сбора мусора?
Если нет, как это работает?
Кроме того, не слишком ли медленно, чтобы объект базы данных всегда просматривал весь список, чтобы узнать, что изменилось и обновить его?
Любое понимание того, как это работает, будет превосходным!
спасибо
да, контекст сохраняет ссылки на загруженные объекты. Это одна из причин, почему он не предназначен для использования с одним экземпляром, разделенным по разным запросам.
Он хранит списки для вставок/удалений. Я не уверен, что он фиксирует обновление, добавив их в список, или он заканчивается в конце. Но вам не следует загружать большие массивы данных одновременно, потому что это само по себе будет большим ударом по производительности, чем любая последняя проверка, которую он может сделать в списке.
DataContext регистрирует события вашего объекта PropertyChanged
, чтобы знать, когда он изменен. На этом этапе он клонирует исходный объект и удерживает его, чтобы сравнить два объекта вместе позже, когда вы делаете свой SubmitChanges()
.
Если мои ссылки на объект равны нулю, означает ли это, что объект контекста также удаляет ссылку на этот объект?
Изменить: Нет. Извините за мой первоначальный ответ, я неправильно понял то, что вы написали. В этом случае контекст данных все еще имеет ссылку на оба объекта, но удалит связь с этими двумя объектами в следующем SubmitChanges()
.
Будьте осторожны. Если вы создали свои собственные объекты вместо использования тех, которые были созданы из .dbml, "магия", которую выполняет datacontext, может работать неправильно.