Entity Framework: С какими недостатками я могу столкнуться, не избавляясь от контекста моего объекта? - PullRequest
0 голосов
/ 13 мая 2009

РЕДАКТИРОВАТЬ: Дубликат Должен ли контекст Entity Framework включаться в оператор Using?

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

Мы используем частичные классы. В этих частичных классах мы раскрываем свойства, которые обращаются к объектам FK. Например, допустим, у меня есть класс Customer с объектом CustomerType FK. В классе я бы выставил свойство CustomerTypeName, которое делает это:

public string CustomerTypeName {
  get {
     if (CustomerType == null) {
         CustomerTypeReference.Load() 
     }

     return CustomerType.CustomerTypeName;
  }
}

Это очень удобно, если исходный запрос не выполняет .Include ("CustomerType").

Однако, если я удалю контекст, указанное выше свойство больше не работает. Итак ... Я предполагаю, что это приводит к паре вопросов:

1) Если я никогда не буду явно распоряжаться контекстом, какие негативы я увижу, если таковые имеются? 2) Есть ли другой способ выполнить отложенную загрузку в вышеупомянутом сценарии и все еще избавиться от контекста?

Ответы [ 3 ]

3 голосов
/ 13 мая 2009

В моем ответе на ' LINQ to SQL - где живет ваш DataContext? ' у нас есть страница как владелец DataContext для жизни страницы, и это страница, которая должным образом удаляет DataContext при удалении самой страницы.

Как @Chu указывает, что это немного грязно, но если вы собираетесь использовать то, что, возможно, является объектом передачи данных непосредственно в вашем пользовательском интерфейсе, тогда ваш пользовательский интерфейс должен контролировать время жизни DataContext.

2 голосов
/ 13 мая 2009

Ну, ObjectContext, которые остаются на неопределенный срок, это нормально, если вы не продолжаете загружать / добавлять много новых объектов.

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

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

Ключом к этому является использование EntityReference.EntityKey и проверка того, что оба объекта отключены.

т.е.

this.CustomerType = Utility.GetDetachedObjectByKey<Customer>(
       this.CustomerTypeReference.EntityKey);

Базовая реализация GetDetachedObjectByKey выглядит примерно так:

public static T GetDetachedObjectByKey<T>(EntityKey key) 
     where T: EntityObject
{
    using (MyContext ctx = new MyContext())
    {
        T t = ctx.GetObjectByKey(key) as T;
        ctx.Detach(t);
        return t;
    }
}

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

Надеюсь, это поможет

Alex

0 голосов
/ 13 мая 2009

Почему бы не сохранить контекст вокруг длины вашего экрана?

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