Почему EF возвращает прокси-класс вместо реальной сущности? - PullRequest
30 голосов
/ 29 февраля 2012

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

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

Мой код не работает в этой строке. У всех моих POCO установлен атрибут Table, но поскольку он возвращает прокси-класс, атрибут таблицы отсутствует.

TableAttribute attrib = (TableAttribute)attributes.Single();

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

Я перемещаю свои объекты в память, используя следующее

MajorClasses = ctx.MajorClasses.ToArray();

Я тоже пытался

MajorClasses = ctx.MajorClasses.AsNoTracking().ToArray();

В моем OnModelCreating у меня есть следующий набор

base.Configuration.ProxyCreationEnabled = false;
            base.Configuration.LazyLoadingEnabled = false;

Ответы [ 5 ]

46 голосов
/ 29 февраля 2012

Вы можете установить ObjectContext.ContextOptions.ProxyCreationEnabled на false.Это не позволит вам использовать некоторые из необычных функций EF, таких как отложенная загрузка, и я считаю, что отслеживание изменений.

Что касается вашего приложения, оно должно иметь возможность обрабатывать прокси как типы, которые они представляют.У вас есть какая-то конкретная проблема?

Редактировать

У нас есть некоторый код, который требует тип POCO вместо типа прокси, и мы делаем следующее, чтобы определить,текущий тип является прокси.

if (entityType.BaseType != null && entityType.Namespace == "System.Data.Entity.DynamicProxies")
{
    entityType = entityType.BaseType;
}
6 голосов
/ 01 ноября 2013

Чтобы отключить создание прокси в Entity Framework 5, вы можете использовать следующее:

_dbContext.Configuration.ProxyCreationEnabled = false;

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

2 голосов
/ 29 февраля 2012

По умолчанию EF использует Отслеживание изменений и использует кэш в памяти всех сущностей.Вы можете использовать различные параметры слияния при работе с EF.По умолчанию для EF 4.1 установлено значение AppendOnly Merge Option.Как я понимаю, это означает, что если вы уже запросили сущность, последующие запросы получат сущность из кэша (если в базе данных не обнаружено изменений).Таким образом, вы можете видеть возвращение кешированной сущности.

В EF 4.1 вы можете использовать NoTracking Merge Option.Это будет идти в базу данных для каждого звонка.

1 голос
/ 14 февраля 2017

В EF 6.1.3 вы можете получить правильный тип, используя

using (var context = new BloggingContext()) { 
    var blog = context.Blogs.Find(1); 
    var entityType = ObjectContext.GetObjectType(blog.GetType()); 
}

Обратите внимание, что если тип, переданный в GetObjectType, является экземпляром типа сущности, который не является прокси-типом, тогдатип объекта все еще возвращается.Это означает, что вы всегда можете использовать этот метод для получения фактического типа сущности без какой-либо другой проверки, чтобы увидеть, является ли тип прокси-типом или нет.

С MSDN

0 голосов
/ 15 июля 2019

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

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