实体框架4:看似简单的查询上的动态代理错误?

时间:2013-04-25 15:09:43

标签: c# entity-framework linq-to-entities table-per-hierarchy

我在POCO Entity Framework应用程序中创建了一个Linq To Entities查询,如下所示:

var orders = stateRepository.Get()
                           .OfType<OrderedState>()
                           .Where(x => x.Id == stateId)
                           .Include(x => x.Order);
return orders.FirstOrDefault();

OfType因为State实体使用Table Per Hierarchy继承。只有OrderedState及其子级可以使用Order属性。

然而,当我运行它时,我遇到以下错误:

  

类型的对象   无法在包含My.NameSpace.Entities.OrderedState'类型的对象的EntityCollection中添加,附加或删除'System.Data.Entity.DynamicProxies.OrderedState_6F372135E57CB68DDA1A42541A941E1F0848887EABD8BD4833D0159C9D8B055F'。“

这是因为EntityFramework被OrderedStateOrderState继承并共享公共属性这一事实感到困惑,这是我感兴趣的?如果我从Linq语句中删除.Include(x => x.Order),则会避免错误,但是当我的整个目的是准确检索该值时,与此状态相关的Order本身将返回null。

编辑:随着更多的研究,我意识到甚至更奇怪的事情正在发生。我的TPH继承层次结构如下:

BasicState
  has many -> StatefulEntities
  has a -> CreationDate

LocationState : BaseState
   has a -> EntityLocation

ReceivedState : LocationState
   has a -> ReceivedDate

ApprovedState : LocationState
  has a -> ApprovedBy

OrderedState 
  has a -> Order

DispatchedState : OrderedState
  has a -> DispatchNumber

所以当我寻找一个OrderedState时,它可能是一个OrderedState或一个DispatchedState,但我感兴趣的是加载Order属性,如果我有一个无类型的话我不能这样做BaseState对象列表。

我现在意识到,当我有.Include( x => x.Order) 实体框架时忽略了类型参数。当我调整种子数据并开始收到此类错误消息时,这变得更加清晰:

  

无法在包含My.NameSpace.Entities.OrderedState'类型的对象的EntityCollection中添加,附加或删除“System.Data.Entity.DynamicProxies.ReceivedState_6F372135E57CB68DDA1A42541A941E1F0848887EABD8BD4833D0159C9D8B055F”类型的对象。“

我对此感到惊讶所以我想我会尝试加强这种类型:

var orders = stateRepository.Get()
                           .OfType<OrderedState>()
                           .Where(x => x is OrderedState && x.Id == stateId )
                           .Include(x => x.Order);

果然,当我不尝试包含Order属性时,我只返回OrderedStates。一旦我使用Include我就会得到一个例外,因为我故意试图避免返回的类型无法返回。我正在查询的ID肯定是OrderedState的ID - 实际上我调用的方法只接受OrderedState对象作为测试,看看是否会阻止这个问题。

我的目标是从TPH表中检索单个类型元素,包括只有这个类型元素才具有的子属性。

0 个答案:

没有答案