|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
EF 5 стойко отбил охоту использовать классы в роли свойств объектов. Вместо этого хранил в свойстве GUID, ну а где искать - приходилось помнить, да. Но там всё было просто. clientID,goodsID - и всё такое. Треш конечно, но большим трешем казалось при сохранении объекта в _НОВЫЙ_ контекст - вытаскивать в этот новый контекст все _существующие_ свойства. Иначе EF пытался добавить эти объекты как новые, соответственно - эксепшн. CF - как бы подталкивает юзать UoW - соответственно - объекты "гуляют" по контекстам - как у себя дома. Вопрос - в текущих версиях EF это как-то изменилось? Можно по взрослому - вместо гуидов использовать классы и модно лениво загружать свойства через точку? Хотя в последнем случае при использовании UoW пролетаем как фанера... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2014, 20:24 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
Monochromatique, LazyLoad работал с первой версии. Объект принадлежит одному контексту. Можно объект от контекста отцепить и прицепить к другому. Ели связанные загружены - сделать с ними тоже самое. Хотя неясно зачем. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2014, 20:57 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
MonochromatiqueТреш конечно, но большим трешем казалось при сохранении объекта в _НОВЫЙ_ контекст - вытаскивать в этот новый контекст все _существующие_ свойства. делаете Attach, хотя сама процедура заталкивания объекта в новый контекст довольно ущербна. какой в этом смысл? но даже если он и есть, повторюсь, делаете Attach. лениво давным давно всё загружается, а если и не лениво, то по требованию. ну и нормализацию никто не отменял. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2014, 21:21 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
gandjustas, У объекта 25 свойств. Я вынимаю объект из контекста и читаю 10. Одно изменяю. Старого контекста уже нет. Теперь мне надо записать объект. Я так понимаю - мне необходимо "прицепить" к новому контексту - все 25 свойств. А вот в случае с простыми типами - об этом вообще думать не надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2014, 21:34 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
Monochromatique, Почему старого контекста нет? Для аттача объекта к контексту нужен только ключ. А еще можно расширением воспользоваться, которое позволяет dml запросы делать. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2014, 22:38 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
MonochromatiqueУ объекта 25 свойств. Я вынимаю объект из контекста и читаю 10. Одно изменяю. Старого контекста уже нет. Теперь мне надо записать объект. Я так понимаю - мне необходимо "прицепить" к новому контексту - все 25 свойств. А вот в случае с простыми типами - об этом вообще думать не надо. значит так. EF это ORM. концепция ORM подразумевает не только мэппинг, но и абстракцию: объект, это совокупность значений его полей и связей. многие, пришедшие из мира SQL, недоумевают, типа зачем же мне вытаскивать весь объект из базы, если мне нужно всего несколько полей или я собираюсь изменить всего одно-два поля. это примерно как недоумевать, зачем приходит весь человек, если я хочу с ним поговорить, он мог бы прислать мне только свои уши и язык. ORM это всегда некоторое снижение производительности, не считая полу-ORM, граничащих по скорости с чистым ADO, где теряется половина смысла (т.е. остаётся только чистый мэппинг полей). используя полноценный ORM необходимо смириться с тем, что работаешь с цельными объектами, и научиться извлекать из этого выгоду. чтобы избегать лишних накладных расходов, надо стремиться к нормализации. т.е. 20 и выше полей, это уже звоночек -- может стоит разбить объект на более конкретные сущности. даже используя ORM, могут найтись узкие места, где абстракция цельного объекта не прокатит, там и надо применять прицельный SQL (или хранимки), но для этого должны найтись весомые причины (например, после профилирования). а так, раньше времени переживать о том, что дёргается весь объект ради пары полей совершенно не стоит. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2014, 23:05 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
hVostt, сначала надо понять что есть Объект, а то может быть такое что тебе придется ВСЮ БД вытянуть :) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2014, 23:34 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
ViPRosсначала надо понять что есть Объект, а то может быть такое что тебе придется ВСЮ БД вытянуть :) для операции Бекап, так оно и есть ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2014, 23:41 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
hVostt, Я абсолютно не переживаю о том, что дергается объект ради пары свойств. Тут даже больше подходит "плевать". До поры до времени, конечно, но - плевать. Я о другом. Если я объекта, допустим order добавлю поле <Guid>clientID, то код, сохраняющий order в context не изменится. db.DbSet<order>.add(order) ну или что то типа такого. Ну а если у ордера я создам поле типа <Client>client - то так просто уже не отделаться. Надо искать этого клиента в контексте - добавлять, если его там нет and so on... Почему EF не берет это на себя? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2014, 00:31 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
hVosttмногие, пришедшие из мира SQL, недоумевают, типа зачем же мне вытаскивать весь объект из базы, если мне нужно всего несколько полей или я собираюсь изменить всего одно-два поля. это примерно как недоумевать, зачем приходит весь человек, если я хочу с ним поговорить, он мог бы прислать мне только свои уши и язык. Все аналогии лживы. Все ORM c поддержкой Linq позволяют написать проекцию и вытащить ровно столько полей сколько нужно. Тащить все поля все - путь к тормозящему приложению. Как раз хранимки чаще страдают этим недостатком. Поддерживать 100500 хранимок с одинаковыми или почти одинаковыми предикатами, но разными проекциями на практике никто не хочет, поэтому делают "универсальные" хранимки, которые тянут больше чем необходимо на каждый запрос. Для изменения данных тоже не нужны целые объекты. В EF (с помощью расширения) и Linq2DB (изкаропки) можно сделать update\insert\delete, не затягивая целый объект. НО! Куча инструментов в .NET работает только с объектами - model binding и data binding например. В этом случае change tracking в ORM помогает избавится от тонны кода для меппинга. Change tracking при этом работает только с целыми объектами. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2014, 01:14 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
MonochromatiquehVostt, Если я объекта, допустим order добавлю поле <Guid>clientID, то код, сохраняющий order в context не изменится. db.DbSet<order>.add(order) ну или что то типа такого. Ну а если у ордера я создам поле типа <Client>client - то так просто уже не отделаться. Надо искать этого клиента в контексте - добавлять, если его там нет and so on... Почему EF не берет это на себя? А зачем? Ты можешь создать оба свойства и использовать то, которое удобнее. Или ты пишешь в поле ClientId, а после этого хочешь получить значение из объекта в свойстве Client? В каком случае такое может понадобиться? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2014, 01:23 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
gandjustasВсе аналогии лживы. „Everybody lies“ gandjustasВсе ORM c поддержкой Linq позволяют написать проекцию и вытащить ровно столько полей сколько нужно. Тащить все поля все - путь к тормозящему приложению. позвольте спросить. на сколько тормозящему? вы лично сами замеряли потерю производительности? на сколько она существенна? или это все личные бредовые фантазии, и, как обычно, экономия на спичках? gandjustasДля изменения данных тоже не нужны целые объекты. В EF (с помощью расширения) и Linq2DB (изкаропки) можно сделать update\insert\delete, не затягивая целый объект. можно, но не нужно. если не нравится работать с объектами, не трогайте LINQ, EF и возвращайтесь к SQL. да, можно вытащить столько полей, сколько нужно. но такое может действительно потребоваться, чтобы вытащить соединённый срез данных, или вытащить большую коллекцию чего-то конкретного, и даже в этом случае применяются DTO, и для этого должен быть смысл. но если мы говорим о конкретной записи, то это должен быть целый объект, а не какие-то поля. как их упаковать и передавать, принимать? анонимными объектами? может в DataTable? и много сэкономите? очень сомневаюсь. короче бред не несите. определённо вы взялись за инструмент, смысла которого до конца ещё не понимаете. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2014, 01:32 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
MonochromatiqueПочему EF не берет это на себя? какие проблемы? вот объект: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.
в последнем случае, сам объект клиента вам не нужен и его не потребуется вытаскивать из контекста, если вам ClientId известен, EF прекрасно вас поймёт. т.е. можно в объекте хранить как навигационное свойство (virtual Client), так и ключ (Guid ClientId) вместе. более того, если вы укажете вот такой ключ с вопросом: Guid? то связь будет не обязательная (по правилам конвенкции EF). естественно, я говорю о Code First. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2014, 01:41 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
hVostt, а как там с правами доступа на большие композитные объекты? допустим есть Объект Самолет(фюзеляж, хвост, крыля) как то можно задать что бы прогер или кто то там не имел права к крылям? но при это мог бы с самолетом или доступными частями поизголяться? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2014, 01:43 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
hVostt, а что будет при сохранении, если в твоем примере ClientId заменить на ClientId нового клиента, а старого Client с ClientId старым удалить ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2014, 01:47 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
ViPRosа что будет при сохранении, если в твоем примере ClientId заменить на ClientId нового клиента, а старого Client с ClientId старым удалить я же спать собирался! не знаю, честно. даже не задумывался об этом никогда. всегда именно так делал, и проблем не испытывал. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2014, 01:51 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
ViPRosа как там с правами доступа на большие композитные объекты? допустим есть Объект Самолет(фюзеляж, хвост, крыля) как то можно задать что бы прогер или кто то там не имел права к крылям? но при это мог бы с самолетом или доступными частями поизголяться? а при чём тут EF? :) это уже вопросы к бизнес-логики и слоя доступа к данным, который реализуется поверх EF. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2014, 01:52 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
hVostt, а ты ради интереса еще раз как проснешьсяи найдешь время пробуй, мне очень интересно и справами и с консистентым кешем при некоторых ограничениях (уникальность и т.д.) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2014, 01:53 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
hVosttViPRosа как там с правами доступа на большие композитные объекты? допустим есть Объект Самолет(фюзеляж, хвост, крыля) как то можно задать что бы прогер или кто то там не имел права к крылям? но при это мог бы с самолетом или доступными частями поизголяться? а при чём тут EF? :) это уже вопросы к бизнес-логики и слоя доступа к данным, который реализуется поверх EF. нифига не понял а разве модель еф не доступна прогеру? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2014, 01:54 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
вот прочел я объект Самолоет и хочу ее почикать, а прав на крылев то и нет кто нить мне запретить как нить что бы я воще самолет не трогал? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2014, 01:56 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
ViPRosнифига не понял а разве модель еф не доступна прогеру? распространённая практика делать интерфейс репозитория, имплементировать его через EF, а поверх репозитория делать ещё сервисный слой с бизнес-логикой. так что прогер обычно напрямую с EF Дела не имеет. если это конечно не курсовая, или не личный бложек, где используется детская студенческая конструкция типа using(var dbContext = new MyContext()) { ... }. задача EF, скрыть механизм непосредственного доступа к данным (т.е. абстрагироваться от базы данных). а свой слой репозитория нужен ещё и для целей тестирования (а не для того, чтобы отцепиться от EF, хотя в идеале это так). объектная модель конечно доступна проггеру, но не DbContext. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2014, 02:00 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
ViPRosвот прочел я объект Самолоет и хочу ее почикать, а прав на крылев то и нет кто нить мне запретить как нить что бы я воще самолет не трогал? это не в компетенции EF. хотя некоторые люди довольно не безосновательно считают, что модель row level security плохо реализуется с использованием EF и они колбасят свои собственные ORM-ы с блекждеком. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2014, 02:01 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
ViPRosа ты ради интереса еще раз как проснешьсяи найдешь время пробуй, мне очень интересно а чо пробовать, когда есть гугл? http://coding.abel.nu/2012/03/ef-code-first-navigation-properties-and-foreign-keys/ ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2014, 02:06 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
hVostt, ок спс посмотрю погуглю а так там легкие тесты ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2014, 02:15 |
|
Что новенького в EF 6.1?
|
|||
---|---|---|---|
#18+
hVosttпозвольте спросить. на сколько тормозящему? вы лично сами замеряли потерю производительности? на сколько она существенна? или это все личные бредовые фантазии, и, как обычно, экономия на спичках? Более десятка раз значительно оптимизировал приложения просто прописыванием проекций в Linq. Дело не в объеме передаваемых данных, хотя бывает заметно при использовании больших текстовых полей, а в том что с проекциями проще использовать индексы. hVosttможно, но не нужно. если не нравится работать с объектами, не трогайте LINQ, EF и возвращайтесь к SQL. Вопрос не в том нравится или нет, а в эффективности программиста и написанного им кода. hVosttда, можно вытащить столько полей, сколько нужно. но такое может действительно потребоваться, чтобы вытащить соединённый срез данных, или вытащить большую коллекцию чего-то конкретного, и даже в этом случае применяются DTO, и для этого должен быть смысл. но если мы говорим о конкретной записи, то это должен быть целый объект, а не какие-то поля. как их упаковать и передавать, принимать? анонимными объектами? может в DataTable? и много сэкономите? очень сомневаюсь. Среднее бизнес-приложение имеет соотношение чтения\записи примерно 98\2. Для веб-сайтов разница обычно на порядок. Поэтому оптимизировать запросы имеет смысл всегда. DTO или DataTable не важно, важно какой запрос уйдет в базу. Именно из-за такой разницы в чтениях-записях можно не стесняясь грузить целые объекты, чтобы обновить одно поле. hVosttкороче бред не несите. определённо вы взялись за инструмент, смысла которого до конца ещё не понимаете. Я понимаю, что искать проблемы в собеседнике проще, чем аргументировать свою точку зрения. Но все таки на профессиональном форуме стоит прибегать к техническим аргументам. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2014, 02:25 |
|
|
start [/forum/topic.php?fid=17&msg=38697327&tid=1349739]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
others: | 251ms |
total: | 404ms |
0 / 0 |