Есть ли способ сообщить ef 4.1, в каком порядке следует загружать свойства объекта? - PullRequest
0 голосов
/ 02 декабря 2011

Скажем, у меня есть сущность Parent и сущность Child, так что у Parent есть виртуальное свойство Children для ICollection. В БД это простой внешний ключ из дочерней таблицы в родительскую таблицу.

Теперь скажите, что у меня есть свойство скалярной строки в Parent с именем Text. Во время метода set свойства Text я хочу получить доступ к экземплярам в свойстве Collection детей.

Когда EF 4.1 восстанавливает родительский объект из базы данных (например, из-за вызова ToList ()), он вызывает метод set для свойства Text, и, кажется, он всегда это делает перед заполнением коллекции Children.

Есть ли способ сообщить EF, чтобы он вызывал set для свойства virutal collection детей перед вызовом set для свойства скалярной строки Text?

1 Ответ

2 голосов
/ 02 декабря 2011

Вы должны следовать совету @ Slauma из комментария и изменить код, потому что это неправильное поведение для постоянных свойств. Даже если работает следующее описание, оно будет очень подвержено ошибкам, потому что вам всегда придется запрашивать данные особым образом.

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

Ленивая загрузка:

Если вы загрузите Parent and Child` загружен лениво, вы не сможете добиться обратной загрузки.

// Now parent is loaded
var parent = context.Parent.First(); 

// Even with lazy loading enabled and your setter accessing nav. property it
// should not load child collection because lazy loading should be temporarily
// turned off during entity materialization to avoid unexpected lazy loads

(не проверено). Вы можете сначала попробовать вручную загрузить все дочерние элементы и затем запросить родительские:

// Now all child for given parent are loaded
var child = context.Child.Where(c => c.Parent.Id == ...).ToList();

// Now parent is loaded and if you are lucky it configures navigation property
// to loaded child prior to evaluating your setter - I guess setter will be 
// evaluated prior to fixing navigation properties so it will not work
var parent = child[0].Parent;

При явной загрузке 1017 * возникнет та же проблема.

Стремительная загрузка:

Проблема та же, и она основана на способе , как работает Include .

Таким образом, если вы включите дочерний элемент в родительский, родитель будет материализован первым.

var parent = context.Parent.Include("Child").First();

Обратная операция в этом случае, скорее всего, не поможет, потому что вызов

var childs = context.Child.Include("Parent").Where(...).ToList();

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

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