почему мы не можем получить ObjectContext из EntityObject - PullRequest
1 голос
/ 29 июля 2011

Хорошо известно, что если у нас есть EntityObject, то нет способа найти ObjectContext, к которому он принадлежит.Я думаю, это достаточно справедливо, но почему мы можем лениво загружать объекты?Конечно, процесс ленивой загрузки должен получить доступ к ObjectContext для загрузки новых объектов?

Ответы [ 3 ]

4 голосов
/ 29 июля 2011

На самом деле вы можете получить ObjectContext от EntityObject: здесь описано ..

2 голосов
/ 06 октября 2014

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

Однако это также можно сделать с помощью отражения:

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 и свойства Context для внутреннего класса BaseEntityWrapper<TEntity>. Тем не менее, если более ранние / более поздние версии .NET имеют разные внутренние свойства / классы, это должно быть достаточно просто, чтобы сделать что-то подобное.

Примечание: это можно еще улучшить, сделав метод расширения для EntityObject и приняв универсальный параметр для возврата строго типизированного ObjectContext. Это также можно упростить, используя некоторый метод для получения значений свойств по имени.

2 голосов
/ 29 июля 2011

Вы правы, учитывая объект, мы не знаем, к какому контексту он принадлежит или к какому сеансу он присоединен. Но Ленивая Загрузка происходит так:

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

Когда вы говорите _Context.Posts.First(), тогда загружается одно сообщение. Затем, когда вы говорите firstPost.Comments, именно тогда загружается список комментариев.

Это возможно, потому что тип поля «Комментарии» в вашем сообщении, вероятно, IList или какой-то такой универсальный интерфейс: это потому, что EF4 может поместить список прокси вместо фактического список комментариев . Список прокси знает о _Context - знает, к какому сеансу или контексту он присоединен. Следовательно, он может загружать фактический список по требованию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...