|
|
|
EF: Загрузка большого дерева связей
|
|||
|---|---|---|---|
|
#18+
Приветствую всех, Вопрос скорее общий, чем конкретный, но тем не менее, хочу услышать мнение других специалистов. Как вы работаете с сущностями с большим кол-вом связей, так, к примеру, есть сущность Customer, которой для полноценной работы нужны данные из таблиц Orders, Products, Categories и т.д. Как вариант решения этой проблемы, подключать ( Include ) все связи на момент получения объекта, но, как мне кажется ЕФ составит не самый рациональный способ выборки из БД, а если ещё и таблицы забиты миллионами записей, то картинка выглядит совсем удручающе (поправьте, если принцип работы у ЕФ другой) . Притом не для каждой ситуации мне нужны все связи полученной записи, а метод получения этой записи хочется написать один, а не плодить их тонны для каждого случая. Идём дальше, вариант номер два - подгружать все свойства по мере надобности , например, получили того же Customer'а и когда начинаем работать с его заказами, то просто вызываем Orders.Load(). Но тут я столкнулся с таким нюансом, в asp.net приложении, Customer'а я получаю в одном месте, а работаю с товарами в другом, следовательно контекста уже нет и Load() произвести не удастся. Ну и третий вариант размышлений такой - можно сущности получать след. способом: context.Customers.ToList() , тогда все связи подгружаются полностью автоматически, т.е. не нужны Include'ы, НО есть и минус, данный вариант не будет работать со связями М-М , что встречается в каждой второй таблице, увы... Как вы боритесь с этой ситуацией? _______________ AnimeBay - аниме магазин, который Вас не разочарует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2010, 19:55 |
|
||
|
EF: Загрузка большого дерева связей
|
|||
|---|---|---|---|
|
#18+
По поводу миллиона записей - тут EF не лучшее средство. На самом деле Include лишь создаёт ключи (референсы) в контексте и не более. И по поводу asp.net - создайте статический контекст и будет Вам счастье. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2010, 20:16 |
|
||
|
EF: Загрузка большого дерева связей
|
|||
|---|---|---|---|
|
#18+
buredПо поводу миллиона записей - тут EF не лучшее средство. почему то я тоже к такому мнению прихожу... buredНа самом деле Include лишь создаёт ключи (референсы) в контексте и не более. но Include также влияет и на сам запрос, т.е. создаёт join'ы... buredИ по поводу asp.net - создайте статический контекст и будет Вам счастье. спасибо, возьму на заметку... _______________ AnimeBay - аниме магазин, который Вас не разочарует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2010, 20:48 |
|
||
|
EF: Загрузка большого дерева связей
|
|||
|---|---|---|---|
|
#18+
buredПо поводу миллиона записей - тут EF не лучшее средство. На самом деле Include лишь создаёт ключи (референсы) в контексте и не более. И по поводу asp.net - создайте статический контекст и будет Вам счастье. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2010, 20:50 |
|
||
|
EF: Загрузка большого дерева связей
|
|||
|---|---|---|---|
|
#18+
WYPMAH, нужно подгружать все свойства по мере надобности, как Вы сказали. Только контекст нужно всегда заново создавать в рамках операции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2010, 20:51 |
|
||
|
EF: Загрузка большого дерева связей
|
|||
|---|---|---|---|
|
#18+
buredПо поводу миллиона записей - тут EF не лучшее средство. Почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2010, 20:51 |
|
||
|
EF: Загрузка большого дерева связей
|
|||
|---|---|---|---|
|
#18+
МСУТолько контекст нужно всегда заново создавать в рамках операции. почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2010, 20:57 |
|
||
|
EF: Загрузка большого дерева связей
|
|||
|---|---|---|---|
|
#18+
МСУburedПо поводу миллиона записей - тут EF не лучшее средство. Почему? чисто имхо. рано или поздно некий Вася Пупкен (с которыми приходится работать в команде) напишет MyDummyTableForMillionRecords.ToList(); А по поводу создания контекста каждый раз: это конечно хорошее средство от всяких заморочек, но реально видел циферки уваж. дяди, что более 50% времени запроса к базе в EF тратится на создание контекста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2010, 21:09 |
|
||
|
EF: Загрузка большого дерева связей
|
|||
|---|---|---|---|
|
#18+
buredчисто имхо. рано или поздно некий Вася Пупкен (с которыми приходится работать в команде) напишет MyDummyTableForMillionRecords.ToList(); Не, Андрей, такая позиция не канает. Ничто не мешает Васе Пупкину и в классическом ADO.NET написать запрос вида SELECT * FROM MyDummyTableForMillionRecords. Ничто не мешает Васе Пупкину и в хибере написать Session.CreateCriteria<MyDummyTableForMillionRecords>().List() Так что нельзя говорить о непредназначенности EF к работе с таблицами-миллиониками, оперируя человеческим фактором :) buredА по поводу создания контекста каждый раз: это конечно хорошее средство от всяких заморочек, но реально видел циферки уваж. дяди, что более 50% времени запроса к базе в EF тратится на создание контекста. Ну в принципе я тоже не против статика, как Вы порекомендовали (ну или Application) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2010, 21:22 |
|
||
|
EF: Загрузка большого дерева связей
|
|||
|---|---|---|---|
|
#18+
МСУ, согласен. Недавно был такой случай. Пупкен создал статический DataContext, потом нечто удалил хранимкой (из другого контекста, т.к. хранимки нужно через ObjectContext дёргать. У нас там сложный алгоритм удаления, тока через хранимку). После этого Пупкен решил прорефрешить первый контекст, типа StoreWins и всё должно работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2010, 21:29 |
|
||
|
EF: Загрузка большого дерева связей
|
|||
|---|---|---|---|
|
#18+
bured, ну вот, и как после этого можно говорить, что EF плохой, ведь плохой не EF, а Пупкен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2010, 21:34 |
|
||
|
EF: Загрузка большого дерева связей
|
|||
|---|---|---|---|
|
#18+
МСУНу в принципе я тоже не против статика, как Вы порекомендовали (ну или Application) Вот на счёт Application я не понял. Datacontext не сериализуется. Это известная проблема. Иначе можно было бы таскать контексты по сети. Только если вручную разбирать дерево -> сериализовать -> запихивать в Application и обратно таким же макаром. Так что статик самое оно. Либо как МСУ сказал: создавать новый контекст каждый раз. Я так делал, но у меня было локальное приложение с одним юзером. В плане масштабируемости это не айс, конечно. Ибо твёрдо знаю, что создание контекста трудоёмкая операция. Ещё один случай про Пупкена. Скотт Гу и Джон Папа убились бы. Пупкен одновременно юзал несколько контекстов и периодически таскал внешние ключи туда-сюда. Я блин чуть не поседел с ним. Короче, EF в неумелых руках превращается в гранату. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2010, 01:44 |
|
||
|
EF: Загрузка большого дерева связей
|
|||
|---|---|---|---|
|
#18+
buredВот на счёт Application я не понял. Datacontext не сериализуется. Это известная проблема. Иначе можно было бы таскать контексты по сети. Только если вручную разбирать дерево -> сериализовать -> запихивать в Application и обратно таким же макаром. Вот Вам классический синглтон контекста: DbContext Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Вот Вам Application: Код: plaintext 1. buredТак что статик самое оно. Не самое оно - а как один из вариантов. buredЛибо как МСУ сказал: создавать новый контекст каждый раз. Я так делал, но у меня было локальное приложение с одним юзером. В плане масштабируемости это не айс, конечно. Ибо твёрдо знаю, что создание контекста трудоёмкая операция. Андрей, что за сказки про трудоемкость? :) Причем тут масштабируемость? :) Объект DataContext не держит открытым подключение с БД, по большому счету его можно даже и не диспоузить (хотя я всегда уничтожаю объект). Контекст берет подключения из Connection Pool'а тогда при необходимости. Какие тут трудоемкости, о чём Вы говорите? buredЕщё один случай про Пупкена. Скотт Гу и Джон Папа убились бы. Пупкен одновременно юзал несколько контекстов и периодически таскал внешние ключи туда-сюда. Я блин чуть не поседел с ним. При чем тут ключи? :) Покажите пальцем в документ, где Scott Gu рекомендует юзать статик? buredКороче, EF в неумелых руках превращается в гранату. Да, вообще, программирование само по себе в неумелых руках превращается в гранату. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2010, 02:40 |
|
||
|
EF: Загрузка большого дерева связей
|
|||
|---|---|---|---|
|
#18+
1. С Application тупанул. 2. По поводу перфоманса - вот статейка от самих создателей EF. На создание контекста уходит более половины времени. Шквал запросов к сайту просто положит систему нах. 3. Про Пупкена: я хз чего он там делал с ключами, но юзать одновременно несколько контекстов не кошерно, мягко говоря. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2010, 03:18 |
|
||
|
EF: Загрузка большого дерева связей
|
|||
|---|---|---|---|
|
#18+
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. А статейка интересная, благодарю Вас. Внёс в закладки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2010, 12:27 |
|
||
|
EF: Загрузка большого дерева связей
|
|||
|---|---|---|---|
|
#18+
WYPMAH Идём дальше, вариант номер два - подгружать все свойства по мере надобности , например, получили того же Customer'а и когда начинаем работать с его заказами, то просто вызываем Orders.Load(). Но тут я столкнулся с таким нюансом, в asp.net приложении, Customer'а я получаю в одном месте, а работаю с товарами в другом, следовательно контекста уже нет и Load() произвести не удастся. те же тапки , но более удобные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2010, 17:23 |
|
||
|
EF: Загрузка большого дерева связей
|
|||
|---|---|---|---|
|
#18+
buredте же тапки , но более удобные. спасибо за статейку... что-то отдалённо похожее я уже для себя соорудил на extension'ах, а, вообще, насколько я понял, лучше подождать полноценный EF4 , в котором реализован Deferred Loading . _______________ AnimeBay - аниме магазин, который Вас не разочарует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2010, 18:07 |
|
||
|
|

start [/forum/topic.php?fid=17&msg=36400201&tid=1351523]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
69ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 238ms |
| total: | 416ms |

| 0 / 0 |
