Подтвердить что ты не робот

LINQ to SQL: установка ObjectTrackingEnabled на false прерывает ленивую загрузку дочерних объектов?

Есть ли способ отключить функции отслеживания объектов LINQ, не отключая также ленивые дочерние ассоциации?

Я использую LINQ2SQL в наборе тестов интеграции. Я использую LINQ для проверки изменений в базе данных, поэтому я хочу, чтобы он работал как простой уровень доступа к данным, а не полный ORM. Для этого я установил для свойства DataTrackingEnabled значение false, чтобы предотвратить кеширование данных LINQ. Это прекрасно работает, за исключением того, что он разбивает ассоциации между объектами.

Например, предположим две таблицы WIDGET и CATEGORY с отношением FK между ними. При включенном отслеживании объектов виджетInstance.CATEGORY корректно загружен. При отключенном отслеживании объектов ничего не загружается, а свойство CATEGORY всегда равно null.

Как предотвратить LINQ от кеширования данных, не препятствуя также ленивой загрузке?

UPDATE: Здесь ссылка на страницу MSDN, на которую ссылается ответ. Дальнейшее исследование также показало, что я могу использовать LoadWith для активной загрузки дочерних данных. В моем случае я просто хочу данные, поэтому полная загрузка прекрасна.

4b9b3361

Ответ 1

В соответствии с MSDN:

Отложенная загрузка требует объекта отслеживание. Только следующие три режимы действительны:

ObjectTrackingEnabled = false. DeferredLoadingEnabled игнорируется и предполагается ложным. Это поведение соответствует только для чтения DataContext.

ObjectTrackingEnabled = true. DeferredLoadingEnabled = false. Эта ситуация соответствует DataContext что позволяет пользователям загружать объект график с помощью директив LoadWith, но это не позволяет отложить загрузки.

Оба имеют значение true. Это по умолчанию.

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