我在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被OrderedState
从OrderState
继承并共享公共属性这一事实感到困惑,这是我感兴趣的?如果我从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表中检索单个类型元素,包括只有这个类型元素才具有的子属性。