Выберите мелкий объект из базы данных, удалив все ссылки из внешних ключей - PullRequest
1 голос
/ 19 сентября 2011

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

Структура базы данных довольно сложная, но давайте предположим, что у меня есть три отношения, A, B иC, где B и C имеют внешние ключи, указывающие на A. Таким образом, можно перемещаться между этими отношениями, используя свойства навигации (и мне нравится эта функция, я не хочу ее отключать).

Данныеизвлечение выполняется с помощью Entity Framework, поэтому я просто связываю его с некоторым ObjectContext.Установлен параметр MergeOptions.NoTracking.

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

Проблема возникает, когда я выбираю объект, скажем, из отношения A. Я возвращаю его из уровня базы данных и передаю его в сериализацию.Он пытается получить доступ к ссылкам на B и C, но пока мы находимся за пределами контекста объекта, это невозможно сделать.

Я знаю, что могу сделать следующее:

AEntry a = db.A.FirstOrDefault(something);
a.BReference.Clear(); //(or .Load())
a.CReference.Clear();
return a;

НоМне не нравится это решение.Я ищу что-то, что позволило бы мне сохранить объект «а» (или, возможно, коллекцию таких объектов) как можно дольше не материализованным, и я не хочу беспокоиться о каждой ссылке (так как может быть многоих).

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

Надеюсь, моя проблема вполне понятна.Спасибо за помощь.

1 Ответ

1 голос
/ 19 сентября 2011

Я думаю, что вы хотите включить ленивую загрузку. См. этот вопрос , либо установите свойство ContextOptions вашего ObjectContext:

context.ContextOptions.LazyLoadingEnabled = false; 

Или, если вы используете модель .edmx, установите аннотацию LazyLoadingEnabled:

<EntityContainer Name="MyEntitiesContext" annotation:LazyLoadingEnabled="false"> 

Конечно, вы должны будете убедиться, что данные, которые вам do явно загружены, тогда (используя метод Include() для ObjectQuery.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...