2009-11-06 7 views
2

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

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

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

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

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

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

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

благодаря

+0

Вы должны добавить тег «linq-to-sql» на свой вопрос, поскольку он специфичен для этого вкуса linq –

+0

marcel: хорошая идея – Toad

+0

Вы меня неправильно поняли, уже есть тег «linq-to-sql», вы только что создали новый тег ;-) –

ответ

2

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

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

+0

Что вы имеете в виду с помощью разных запросов? Shoudl вы создаете новый контекст для каждого запроса? – Toad

+0

@reinier, который находится на asp.net (что может и не быть вашим случаем), если u хранит один и тот же экземпляр контекста для разных запросов, u сохраняет все отслеживаемые объекты там.Помимо производительности, рассмотрим, что, если какой-то процесс выполнял некоторые изменения в некоторых объектах db, и из-за некоторой проверки u не отправил эти изменения ... затем в другом процессе, сделайте некоторые несвязанные изменения и вызовите submit изменения в контексте - - u будет совершать те другие изменения, на которые не намеревался. – eglasius

+0

Да, рекомендуется, чтобы ваш жизненный цикл datacontext был как можно короче. –

2

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

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

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

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

+0

с созданием объектов я имел в виду те, что созданный из моих таблиц dbml – Toad

+0

@Marcel afaik не удаляет объекты без ссылок, когда и устанавливают собственные ссылки объекта на нуль. – eglasius

+0

Спасибо Freddy, я отредактировал свой ответ –

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

  • Нет связанных вопросов^_^