2015-07-01 3 views
2

В проекте EF 6 я пишу функции проверки для объектов. некоторые из них являются статическими, а другие - экземплярами самих сущностей.Определите, был ли установлен контекст прокси-объекта объекта

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

Обратите внимание: эти функции НЕ имеют доступа к объекту контекста, а только к классам сущностей.

В качестве примера, метод проверяет достоверность сущности и каскадов на все связанные Department.Employee объекты Department.

  • Если иерархия была создана вручную, проверка будет успешной.
  • Если иерархия была создана с использованием контекста, который все еще жив, проверка будет успешной, хотя и медленнее.
  • Если иерархия была создана с использованием контекста, который был удален, проверка завершится неудачей с помощью ObjectDisposedException (при условии, что создание прокси было включено и .Include(***) не был использован).

Итак, вопрос, можно ли выявить вышеуказанные сценарии без доступа к экземпляру DbContext? Если нет, то как мы можем лучше всего проверить целые иерархии независимо от того, как они были созданы.

var result = true; 
var departments = ???; // Constructed manually or through a DbContext instance. 

foreach (var department in departments) 
{ 
    result &= department.Validate(); 

    foreach (var employee in department.Employees) 
    { 
     result &= employee.Validate(); 
    } 
} 

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

+0

Я бы посоветовал использовать двоичные операторы на bools. Они могут иметь удивительные эффекты, такие как два истинных значения в сочетании с ложным. – usr

ответ

1

Из Вашего вопроса

Пожалуйста, обратите внимание, что эти функции не имеют доступа к объекту контекста, только классы сущностей.

два решения приходят на ум, ни один действительно аппетитные:

  1. Создайте свой собственный трекер и сделать его доступным для этих методов как-то.
  2. Добавьте что-нибудь к своим объектам, например, свойство WasLoaded, которое будет установлено при запросе вашего контекста. То, что WasLoaded может быть установлено либо
    1. Написание перехватчика EF, который его устанавливает.
    2. Добавление искусственного столбца bit со всеми значениями, установленными в 1. Затем сопоставьте это свойство; свойство будет false, если вы построили его вне контекста, true, если он загружен из контекста.

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

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

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

Смежные вопросы