как linq2sql отслеживает объекты базы данных?

2

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

Итак, мой вопрос касается linq2sql.

Если я выполняю запрос и получаю некоторые объекты базы данных, или я создаю новый, каким-то образом объект linqcontext сохраняет ссылки на эти объекты. Если что-то меняется в одном из объектов, объект контекста "знает", что изменилось и нуждается в обновлении.

Если мои ссылки на объект равны нулю, означает ли это, что объект контекста также удаляет ссылку на этот объект? Или объект контекста медленно заполняется множеством ссылок и сохраняет объекты базы данных от сбора мусора?

Если нет, как это работает?

Кроме того, не слишком ли медленно, чтобы объект базы данных всегда просматривал весь список, чтобы узнать, что изменилось и обновить его?

Любое понимание того, как это работает, будет превосходным!

спасибо

  • 0
    Вы должны добавить тег "linq-to-sql" к вашему вопросу, поскольку он специфичен для данного вида linq
  • 0
    Марсель: хорошая идея
Показать ещё 2 комментария
Теги:
linq
linq-to-sql
internals

2 ответа

2
Лучший ответ

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

Он хранит списки для вставок/удалений. Я не уверен, что он фиксирует обновление, добавив их в список, или он заканчивается в конце. Но вам не следует загружать большие массивы данных одновременно, потому что это само по себе будет большим ударом по производительности, чем любая последняя проверка, которую он может сделать в списке.

  • 0
    что вы имеете в виду под разделить по различным запросам? Ты хочешь создать новый контекст для каждого запроса?
  • 0
    @reinier, который находится на asp.net (что может не соответствовать вашему случаю), если вы сохраняете один и тот же экземпляр контекста для разных запросов, вы сохраняете все отслеживаемые объекты там. Помимо производительности, подумайте, что если какой-то процесс делал некоторые изменения в некоторых объектах БД и из-за некоторой проверки вы не отправили эти изменения ... тогда в другом процессе вы делаете некоторые несвязанные изменения и вызываете изменения в контексте - - вы бы совершили те другие изменения, которые вы не собирались делать.
Показать ещё 3 комментария
2

DataContext регистрирует события вашего объекта PropertyChanged, чтобы знать, когда он изменен. На этом этапе он клонирует исходный объект и удерживает его, чтобы сравнить два объекта вместе позже, когда вы делаете свой SubmitChanges().

Если мои ссылки на объект равны нулю, означает ли это, что объект контекста также удаляет ссылку на этот объект?

Изменить: Нет. Извините за мой первоначальный ответ, я неправильно понял то, что вы написали. В этом случае контекст данных все еще имеет ссылку на оба объекта, но удалит связь с этими двумя объектами в следующем SubmitChanges().

Будьте осторожны. Если вы создали свои собственные объекты вместо использования тех, которые были созданы из .dbml, "магия", которую выполняет datacontext, может работать неправильно.

  • 0
    с созданием объектов я имел в виду те, которые DBL создан из моих таблиц
  • 0
    @Marcel afaik не удаляет объекты, на которые нет ссылок, когда вы устанавливаете собственные ссылки на объект равными нулю.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню