Проверка EF4, является ли коллекция или связанная сущность прокси для сущностей с самостоятельным отслеживанием.

Все,

Я начинаю с Entity Framework 4 (еще не CTP5) и изучаю сложности миграции NHibernate на EF.

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

Я перенес этот код, чтобы использовать интерфейс IRelatedEnd для коллекций, но акт приведения моего ICollection к IRelatedEnd приводит к тому, что EF загружает коллекцию... в результате коллекция никогда не является прокси, когда я проверяю IsLoaded == true в следующей строке.

Нужно ли мне делать что-то дополнительно, учитывая, что это пользовательский POCO или это ожидаемое поведение?

Аналогичным образом, можно ли как-то проверить, является ли связанный объект прокси или нет?

Большое спасибо


person GrahamB    schedule 11.03.2011    source источник


Ответы (1)


рекомендуемый метод на MSDN для проверки прокси-серверов заключается в использовании чего-то вроде это:

public static bool IsProxy(object type)
{
    return type != null && ObjectContext.GetObjectType(type.GetType()) != type.GetType();
}

Этот метод работает как в EF 4, так и в EF 4.1 Codefirst.

Что касается ленивой загрузки, я никогда не использовал IRelatedEnd — просто оставил свойства навигации в POCO как ICollection и убедился, что ленивая загрузка включена. Кроме того, это просто работает.

context.ContextOptions.LazyLoadingEnabled = true;

В edmx также есть опция отложенной загрузки.

person Leniency    schedule 17.05.2011
comment
Ваш ответ верен, но я хочу указать на этот важный момент: если вы просто хотите найти реальный тип объекта, вы можете всегда использовать ObjectContext.GetObjectType() независимо от того, является ли он на самом деле динамическим прокси. Я упоминаю об этом, потому что я оказался здесь по этой причине, но такая проверка совершенно не нужна. См.: blogs.msdn.com/b/adonet/archive/2011/02/02/ - person Casey; 20.02.2014