Загрузка из базы данных без прокси-классов? - PullRequest
7 голосов
/ 14 июля 2011

В Entity Framework 4 Можно ли выбрать загрузку некоторых запросов в POCO без использования прокси-классов? (В целях кэширования этого объекта для использования в будущем только для чтения). Я использую репозиторий - шаблон службы.

Под этим я подразумеваю:

var order = _orderService.GetById(1);
// after order is loaded then we can see in the debugger that:
// order.Customer is of type System.Data.Entity.DynamicProxy.Customer_17631AJG_etc

Я хочу, чтобы order.Customer фактически использовал тип POCO MyApp.Models.Entities.Customer вместо прокси для этого типа.

РЕДАКТИРОВАТЬ: Основываясь на предложении Ладислава добавить метод «GetUnproxied» в репозиторий, я сделал это изменение:

// this is the current method that must return a DynamicProxy
public IQueryable<T> GetQuery()
{
    return ObjectSet.AsQueryable();
}

// this is the new additional method that must return the plain POCO
public IQueryable<T> GetReadOnly()
{
    ObjectContext.ContextOptions.ProxyCreationEnabled = false;
    var readOnly = ObjectSet.AsQueryable();
    ObjectContext.ContextOptions.ProxyCreationEnabled = true;
    return readOnly;
}

Это правильно?

Это не выглядит потокобезопасным для меня. Оба метода используют один и тот же экземпляр ObjectContext, поэтому возможно, что ProxyCreationEnabled == false произойдет в одном потоке, а затем public IQueryable<T> GetQuery() будет вызван в другом потоке, что внезапно будет означать, что прокси-метод может вернуть объект без прокси.

1 Ответ

16 голосов
/ 14 июля 2011

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

context.ContextOptions.ProxyCreationEnabled = false;

Я думаю, что это также можно отключить глобально в дизайнере EDMX.

Обновление:

Это относится к ObjectContext. С DbContext код:

context.Configuration.ProxyCreationEnabled = false;

плюс я не вижу никакой опции в дизайнере edmx

...