powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF: Загрузка большого дерева связей
17 сообщений из 17, страница 1 из 1
EF: Загрузка большого дерева связей
    #36400153
Фотография WYPMAH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую всех,

Вопрос скорее общий, чем конкретный, но тем не менее, хочу услышать мнение других специалистов.

Как вы работаете с сущностями с большим кол-вом связей, так, к примеру, есть сущность Customer, которой для полноценной работы нужны данные из таблиц Orders, Products, Categories и т.д.

Как вариант решения этой проблемы, подключать ( Include ) все связи на момент получения объекта, но, как мне кажется ЕФ составит не самый рациональный способ выборки из БД, а если ещё и таблицы забиты миллионами записей, то картинка выглядит совсем удручающе (поправьте, если принцип работы у ЕФ другой) . Притом не для каждой ситуации мне нужны все связи полученной записи, а метод получения этой записи хочется написать один, а не плодить их тонны для каждого случая.

Идём дальше, вариант номер два - подгружать все свойства по мере надобности , например, получили того же Customer'а и когда начинаем работать с его заказами, то просто вызываем Orders.Load(). Но тут я столкнулся с таким нюансом, в asp.net приложении, Customer'а я получаю в одном месте, а работаю с товарами в другом, следовательно контекста уже нет и Load() произвести не удастся.

Ну и третий вариант размышлений такой - можно сущности получать след. способом: context.Customers.ToList() , тогда все связи подгружаются полностью автоматически, т.е. не нужны Include'ы, НО есть и минус, данный вариант не будет работать со связями М-М , что встречается в каждой второй таблице, увы...

Как вы боритесь с этой ситуацией?

_______________
AnimeBay - аниме магазин, который Вас не разочарует.
...
Рейтинг: 0 / 0
EF: Загрузка большого дерева связей
    #36400176
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу миллиона записей - тут EF не лучшее средство.
На самом деле Include лишь создаёт ключи (референсы) в контексте и не более.
И по поводу asp.net - создайте статический контекст и будет Вам счастье.
...
Рейтинг: 0 / 0
EF: Загрузка большого дерева связей
    #36400199
Фотография WYPMAH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buredПо поводу миллиона записей - тут EF не лучшее средство.
почему то я тоже к такому мнению прихожу...

buredНа самом деле Include лишь создаёт ключи (референсы) в контексте и не более.
но Include также влияет и на сам запрос, т.е. создаёт join'ы...

buredИ по поводу asp.net - создайте статический контекст и будет Вам счастье.
спасибо, возьму на заметку...

_______________
AnimeBay - аниме магазин, который Вас не разочарует.
...
Рейтинг: 0 / 0
EF: Загрузка большого дерева связей
    #36400200
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buredПо поводу миллиона записей - тут EF не лучшее средство.
На самом деле Include лишь создаёт ключи (референсы) в контексте и не более.
И по поводу asp.net - создайте статический контекст и будет Вам счастье.
...
Рейтинг: 0 / 0
EF: Загрузка большого дерева связей
    #36400201
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WYPMAH, нужно подгружать все свойства по мере надобности, как Вы сказали. Только контекст нужно всегда заново создавать в рамках операции.
...
Рейтинг: 0 / 0
EF: Загрузка большого дерева связей
    #36400203
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buredПо поводу миллиона записей - тут EF не лучшее средство.
Почему?
...
Рейтинг: 0 / 0
EF: Загрузка большого дерева связей
    #36400207
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУТолько контекст нужно всегда заново создавать в рамках операции.
почему?
...
Рейтинг: 0 / 0
EF: Загрузка большого дерева связей
    #36400211
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУburedПо поводу миллиона записей - тут EF не лучшее средство.
Почему?
чисто имхо. рано или поздно некий Вася Пупкен (с которыми приходится работать в команде) напишет MyDummyTableForMillionRecords.ToList();

А по поводу создания контекста каждый раз: это конечно хорошее средство от всяких заморочек, но реально видел циферки уваж. дяди, что более 50% времени запроса к базе в EF тратится на создание контекста.
...
Рейтинг: 0 / 0
EF: Загрузка большого дерева связей
    #36400213
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buredчисто имхо. рано или поздно некий Вася Пупкен (с которыми приходится работать в команде) напишет MyDummyTableForMillionRecords.ToList();
Не, Андрей, такая позиция не канает. Ничто не мешает Васе Пупкину и в классическом ADO.NET написать запрос вида SELECT * FROM MyDummyTableForMillionRecords. Ничто не мешает Васе Пупкину и в хибере написать Session.CreateCriteria<MyDummyTableForMillionRecords>().List()
Так что нельзя говорить о непредназначенности EF к работе с таблицами-миллиониками, оперируя человеческим фактором :)

buredА по поводу создания контекста каждый раз: это конечно хорошее средство от всяких заморочек, но реально видел циферки уваж. дяди, что более 50% времени запроса к базе в EF тратится на создание контекста.
Ну в принципе я тоже не против статика, как Вы порекомендовали (ну или Application)
...
Рейтинг: 0 / 0
EF: Загрузка большого дерева связей
    #36400216
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

согласен.

Недавно был такой случай.

Пупкен создал статический DataContext, потом нечто удалил хранимкой (из другого контекста, т.к. хранимки нужно через ObjectContext дёргать. У нас там сложный алгоритм удаления, тока через хранимку).
После этого Пупкен решил прорефрешить первый контекст, типа StoreWins и всё должно работать.
...
Рейтинг: 0 / 0
EF: Загрузка большого дерева связей
    #36400217
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bured, ну вот, и как после этого можно говорить, что EF плохой, ведь плохой не EF, а Пупкен
...
Рейтинг: 0 / 0
EF: Загрузка большого дерева связей
    #36400324
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУНу в принципе я тоже не против статика, как Вы порекомендовали (ну или Application)
Вот на счёт Application я не понял.
Datacontext не сериализуется. Это известная проблема. Иначе можно было бы таскать контексты по сети. Только если вручную разбирать дерево -> сериализовать -> запихивать в Application и обратно таким же макаром.

Так что статик самое оно. Либо как МСУ сказал: создавать новый контекст каждый раз.
Я так делал, но у меня было локальное приложение с одним юзером.
В плане масштабируемости это не айс, конечно. Ибо твёрдо знаю, что создание контекста трудоёмкая операция.

Ещё один случай про Пупкена. Скотт Гу и Джон Папа убились бы. Пупкен одновременно юзал несколько контекстов и периодически таскал внешние ключи туда-сюда. Я блин чуть не поседел с ним.

Короче, EF в неумелых руках превращается в гранату.
...
Рейтинг: 0 / 0
EF: Загрузка большого дерева связей
    #36400345
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buredВот на счёт Application я не понял.
Datacontext не сериализуется. Это известная проблема. Иначе можно было бы таскать контексты по сети. Только если вручную разбирать дерево -> сериализовать -> запихивать в Application и обратно таким же макаром.
Вот Вам классический синглтон контекста:

DbContext
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
using AdventureWorksModel;
public class DbContext
{
    private static AdventureWorksEntities _instance = null;
    private static readonly object PadLock = new object();
    public static AdventureWorksEntities Instance
    {
        get
        {
            lock (PadLock)
            {
                return _instance ?? new AdventureWorksEntities();
            }
        }
    }
}


Вот Вам Application:

Код: plaintext
1.
Application["Instance"] = DbContext.Instance;
var products = (Application["Instance"] as AdventureWorksEntities).Product.ToList();

buredТак что статик самое оно.
Не самое оно - а как один из вариантов.

buredЛибо как МСУ сказал: создавать новый контекст каждый раз.
Я так делал, но у меня было локальное приложение с одним юзером.
В плане масштабируемости это не айс, конечно. Ибо твёрдо знаю, что создание контекста трудоёмкая операция.
Андрей, что за сказки про трудоемкость? :) Причем тут масштабируемость? :)
Объект DataContext не держит открытым подключение с БД, по большому счету его можно даже и не диспоузить (хотя я всегда уничтожаю объект). Контекст берет подключения из Connection Pool'а тогда при необходимости. Какие тут трудоемкости, о чём Вы говорите?

buredЕщё один случай про Пупкена. Скотт Гу и Джон Папа убились бы. Пупкен одновременно юзал несколько контекстов и периодически таскал внешние ключи туда-сюда. Я блин чуть не поседел с ним.
При чем тут ключи? :)
Покажите пальцем в документ, где Scott Gu рекомендует юзать статик?

buredКороче, EF в неумелых руках превращается в гранату.
Да, вообще, программирование само по себе в неумелых руках превращается в гранату.
...
Рейтинг: 0 / 0
EF: Загрузка большого дерева связей
    #36400354
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. С Application тупанул.

2. По поводу перфоманса - вот статейка от самих создателей EF. На создание контекста уходит более половины времени.
Шквал запросов к сайту просто положит систему нах.

3. Про Пупкена: я хз чего он там делал с ключами, но юзать одновременно несколько контекстов не кошерно, мягко говоря.
...
Рейтинг: 0 / 0
EF: Загрузка большого дерева связей
    #36400491
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bured2. По поводу перфоманса - вот статейка от самих создателей EF. На создание контекста уходит более половины времени.
Шквал запросов к сайту просто положит систему нах.
Спасибо, Андрей, интересная статейка.
Итак, начинаю Вас успокаивать :)
1. В статье ни слова не сказано про половину времени на создание контекста.
2. В статье приведен Warm query results
, из которого видно, что на создание контекста затраичвается 1.38% :)
3. Это и нормально, так как на создание экземпляра класса любого более или менее сложного, уйдет не меньше
4. Поймите главное: При создании контекста не происходит Query creation, key kreation, relationship span, материализация и т.д. Это всё произойдет только при выполнении запроса. Что никоим боком не коррелирует с вариантами организации создания контекстов.
5. Итак, создание контекста, - это банальное создание, к примеру, того же SqlConnection (вспомните азы классического ADO.NET - создали коннекцию, отработали с ней, отдиспоузили её). Тут всё тоже самое.

bured3. Про Пупкена: я хз чего он там делал с ключами, но юзать одновременно несколько контекстов не кошерно, мягко говоря.
Вспомните классический ADO, где люди держали открытыи соединения на протяжении всей жизни программы. Сколько клиентов (клиент-сервер), столько и коннектов. И ничего, никто не умирал :)
Ну это я шучу, тут другая немного тема. Юзать много контекстов не то, что не кошерно - а вредно. Речь о другом: можете свободно создавать и удалять контекст при отработке блоков логики. То есть, при каждом обращении к БД создается, отрабатывается и диспоузится контекст. По перфомансу это бить не будет.

P.S. А статейка интересная, благодарю Вас. Внёс в закладки.
...
Рейтинг: 0 / 0
EF: Загрузка большого дерева связей
    #36400774
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WYPMAH
Идём дальше, вариант номер два - подгружать все свойства по мере надобности , например, получили того же Customer'а и когда начинаем работать с его заказами, то просто вызываем Orders.Load(). Но тут я столкнулся с таким нюансом, в asp.net приложении, Customer'а я получаю в одном месте, а работаю с товарами в другом, следовательно контекста уже нет и Load() произвести не удастся.

те же тапки , но более удобные.
...
Рейтинг: 0 / 0
EF: Загрузка большого дерева связей
    #36400849
Фотография WYPMAH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buredте же тапки , но более удобные.
спасибо за статейку... что-то отдалённо похожее я уже для себя соорудил на extension'ах, а, вообще, насколько я понял, лучше подождать полноценный EF4 , в котором реализован Deferred Loading .

_______________
AnimeBay - аниме магазин, который Вас не разочарует.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF: Загрузка большого дерева связей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]