Использует ли LINQ to Entities экземпляры объектов? - PullRequest
1 голос
/ 11 ноября 2008

Использование LINQ to Entities звучит как отличный способ запроса к базе данных и получения реальных объектов CLR, которые я могу изменить, привязки данных и т. Д. Но если я выполню тот же запрос во второй раз, получу ли я обратные ссылки на те же объекты CLR или совершенно новый набор?

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

Ответы [ 3 ]

1 голос
/ 11 ноября 2008

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

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

В зависимости от бизнес-ситуации может быть допустимо, чтобы вторая транзакция с устаревшими данными не выполнялась при фиксации.

Кроме того, представьте себе старый добрый сценарий IDataReader / DataSet. Два запроса вернут двух разных читателей, которые будут заполнять разные наборы данных. Таким образом, проблема дублирования данных не зависит от ORM.

1 голос
/ 11 ноября 2008

В рамках одного и того же DataContext я понимаю, что вы всегда будете получать одни и те же объекты - для запросов, которые возвращают полные объекты вместо проекций.

Однако разные DataContexts будут извлекать разные объекты - так что есть риск увидеть там устаревшие данные, да.

0 голосов
/ 11 ноября 2008

[упс; обратите внимание, что этот ответ относится к Linq-to-SQL, а не к Entity Framework.]

Я оставил это здесь (вместо того, чтобы удалить), потому что это частично относится к теме и может быть полезно.


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

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

Так что, в основном, IIRC вам нужно использовать:

// uses object identity cache (IIRC)
var obj = ctx.Single(x=>x.Id == id);

но не:

// causes round-trip (IIRC)
var obj = ctx.Where(x=>x.Id == id).Single();
...