Список ObjectSets на ObjectContext и EntityCollections на ObjectSet - PullRequest
1 голос
/ 19 декабря 2011

Я работаю с EntityFramework и шаблоном IRepository, и мне нужно добавить некоторые события ко всем EntityCollections.

Есть ли способ получить список коллекций в ObjectContext?
Мне также нужен способ получить все коллекции в ObjectSet / EntityCollection.Возможно ли это?

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

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

Ответы [ 2 ]

3 голосов
/ 19 декабря 2011

Вы можете получить ObjectSets, используя следующий непроверенный код:

var objSetProps = instanceOfObjectContext.GetType().GetProperties().Where(prop => prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(ObjectSet<>));

foreach(PropertyInfo objSetProp in objSetProps)
{
    var objSet = objSetProp.GetValue(instanceOfObjectContext, BindingFlags.GetProperty, null, null, null);
}

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

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

2 голосов
/ 07 января 2012

Чтобы расширить приведенный выше ответ относительно подхода ObjectSet, в моем случае, чтобы установить базовый тип в общем типе propertyinfo, вы выполните следующее:

propertyInfo.PropertyType.GetGenericArguments();

Что даст вам типы параметров, применяемых к этому конкретному универсальному типу во время выполнения. Я полагаю, что для EntityFramework эти ObjectSets поддерживают только один параметр, поэтому выяснить базовый тип объекта будет просто:

propertyInfo.PropertyType.GetGenericArguments().First();

Спасибо вышеупомянутому господину Бэбкоку, который привел меня сюда.

...