为什么我们不能从EntityObject获取ObjectContext

众所周知,如果我们有一个EntityObject,就无法找到它所属的ObjectContext。 这是公平的,我猜,但为什么我们可以延迟加载对象呢? 当然,延迟加载的过程必须访问ObjectContext才能加载新对象?

实际上你可以从EntityObject获取ObjectContext : 这里描述了 ..

你是对的,给定一个对象,我们不知道它属于哪个上下文,或者它附加到哪个会话。 但懒惰加载发生如下:

 var firstPost = _Context.Posts.First() var commentList = firstPost.Comments 

当你说_Context.Posts.First()然后加载一个post。 然后当你说firstPost.Comments时,加载评论列表。

这是可能的,因为Post中的Comments字段的类型可能是IList或某些通用接口:这是因为EF4可以放置代理列表而不是实际的注释列表代理列表知道_Context – 知道它附加到哪个会话或上下文。 因此,它能够按需加载实际列表

接受的答案是有限的,因为它只有在实体至少有一个关系时才能起作用。

但是,这也可以通过reflection来完成:

 public ObjectContext Context(EntityObject entity) { var relationshipManager = ((IEntityWithRelationships)entity).RelationshipManager; var wrappedOwnerProperty = relationshipManager.GetType().GetProperty("WrappedOwner",BindingFlags.Instance | BindingFlags.NonPublic); var wrappedOwner = wrappedOwnerProperty.GetValue(relationshipManager); var contextProperty = wrappedOwner.GetType().GetProperty("Context"); return (ObjectContext)contextProperty.GetValue(wrappedOwner); } 

在VB.NET中:

 Function Context(entity As EntityObject) As ObjectContext Dim relationshipManager = DirectCast(entity, IEntityWithRelationships).RelationshipManager Dim wrappedOwnerProperty = relationshipManager.GetType.GetProperty("WrappedOwner", BindingFlags.Instance Or BindingFlags.NonPublic) Return wrappedOwnerProperty.GetValue(relationshipManager).Context End Function 

注意:这是在.NET Framework v.4.5.1下测试的。 YMMV,因为这取决于内部的WrappedOwner属性和内部BaseEntityWrapper类的Context属性。 然而,如果早期版本的.NET具有不同的内部属性/类,那么它应该足够简单,可以做类似的事情。

注意:这可以通过使它成为EntityObject的扩展方法,并通过使用generics参数返回强类型的ObjectContext来进一步改进。 也可以通过使用某种方法按名称获取属性值来简化它。