EF中的ObjectMaterialize不会在第一级查询中触发

时间:2015-04-21 16:28:03

标签: c# linq entity-framework objectcontext

我有一个查询,例如:

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;

我看到的唯一区别是第一个查询从选择结果中构建一个新对象。

知道为什么事件不会开火?

1 个答案:

答案 0 :(得分:8)

事件仅针对Entity对象投影触发,这就是您看到此行为的原因。

  

"如果查询使用了投影并且没有匹配的实体,则结果将具体化为DbDataRecords(或使用LINQ to Entities查询时的匿名类型)而不是实体对象 " Ref -Programming Entity Framework(Julia Lerman)P-244)

ObjectMarialized状态的定义

  

在作为查询或加载操作的一部分从数据源中的数据创建新实体对象时发生。

参考。 https://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.objectmaterialized(v=vs.110).aspx

由于投影不会创建实体对象,因此它不会触发事件。