2015-04-21 2 views
2

У меня есть запрос, такие как:ObjectMaterialize в EF не стреляя на первый запрос уровня

Query Syntax 1 - Does not fire the somehandler; 
var results = (from I in db.mytable 
       select new myObject() { 
         column1 = i.Prop1 
       }).ToList(); 

Query Syntax 2 - Does fires the somehandler event; 
var results = (from I in db.mytable 
       select I).toList(); 

в моем ContextClass у меня есть что-то вроде этого:

((IOjectContextAdapter)this).ObjectContext.ObjectMaterialized += somehandler; 

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

Любая идея, почему событие не срабатывало?

ответ

8

Событие срабатывает только для проекций объекта Entity, поэтому вы видите это поведение.

«Если запрос используется проекция и нет соответствия сущности, результаты материализовались в DbDataRecords (или анонимные тип, когда использовали LINQ к объектам запросу) вместо сущности объекты,» Ref Программирующий Entity Framework (Julia Лерман) P-244)

определение для ObjectMarialized утверждает

Происходит, когда новый объект объекта создается из данных в источнике данных как часть операции запроса или загрузки.

Реф. https://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.objectmaterialized(v=vs.110).aspx

Поскольку проекция не создает объект Entity, он не запускает событие.

+0

Хорошо. Теперь, когда мы это установили, как мы можем запускать событие типа ObjectMaterialized на любом объекте poco, который выходит из запроса EF? Btw, название события вводит в заблуждение. Его следует называть «EntityObjectMaterialized». Это было бы более специфично для того, что он на самом деле делает. –