Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как правильно работать с коллекциями в EF?
|
|||
|---|---|---|---|
|
#18+
Спрошу тут, так как ASP MVC тут - половина жары. У меня с клиента пришла форма. Объект заявка. В заявке перечислены бренды. То есть - есть поле brandIds - где хранятся гуиды брендов. brandIds в базу не сохраняется ("NotMapped"). Надо теперь эти гуиды брендов сохранить в базу, привязав к заявке. Вопрос №1 Нет ли в ASP MVC каких-то телодвижений, которые преlпринимает сама плаnформа и превращает полуфабрикат объекта с распарсенной формы в полноценный объект, который осталось только запихнуть в контекст? То есть объект заявка с уже прилепленными к ней объектами вида заявка_бренд? Вопрос №2 Если никакой магии нет, то как правильней запихнуть данные в базу? Я пока вижу только так: (поскольку есть гуиды..) 1. Находим существующие бренды в заявке. (Объект заявка_бренд) 2. Стираем их. (Чтобы не парится с вычислением новых/старых) 3. Создаем новые. 4. Аттачим в составе заявки к контексту. 5. Сохраняем. 6. Как-то их потом читаем. Как-то дофига движений.. Раньше я спецово в EF работал только с примитивными типами данных. И горя не знал. Решил типа модно, со связями, а теперь чешу репу... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2015, 01:46 |
|
||
|
Как правильно работать с коллекциями в EF?
|
|||
|---|---|---|---|
|
#18+
MonochromatiqueСпрошу тут, так как ASP MVC тут - половина жары. У меня с клиента пришла форма. Объект заявка. В заявке перечислены бренды. То есть - есть поле brandIds - где хранятся гуиды брендов. brandIds в базу не сохраняется ("NotMapped"). Надо теперь эти гуиды брендов сохранить в базу, привязав к заявке. Вопрос №1 Нет ли в ASP MVC каких-то телодвижений, которые преlпринимает сама плаnформа и превращает полуфабрикат объекта с распарсенной формы в полноценный объект, который осталось только запихнуть в контекст? То есть объект заявка с уже прилепленными к ней объектами вида заявка_бренд? Вопрос №2 Если никакой магии нетМагии нет, есть ModelBinder Monochromatiqueкак правильней запихнуть данные в базу?Ну либо отдельной командой, либо сформированный таки объект передать в репозиторий и внутри последнего уже разбираться с EF, или чем-то другим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2015, 07:56 |
|
||
|
Как правильно работать с коллекциями в EF?
|
|||
|---|---|---|---|
|
#18+
Путем нечеловеческого напряжения мозгов - я понял как работает EF. В принципе - подчинить логике можно. Вот код. Делает то, что нужно. Но не нравится количество. Его можно сократить? Только не прописывать в ModelBinder ничего. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Это разумное количество кода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2015, 15:30 |
|
||
|
Как правильно работать с коллекциями в EF?
|
|||
|---|---|---|---|
|
#18+
skyANAМагии нет, есть ModelBinder ModelBinder здесь не подойдёт, так как решает совсем другие задачи. MonochromatiqueВопрос №1 Нет ли в ASP MVC каких-то телодвижений, которые преlпринимает сама плаnформа и превращает полуфабрикат объекта с распарсенной формы в полноценный объект, который осталось только запихнуть в контекст? То есть объект заявка с уже прилепленными к ней объектами вида заявка_бренд? Не знаю, что ты там понимаешь под полуфабрикатом объекта, но суть в следующем: Порядок отображения данных (Display): Controller/Action → ViewModel → View Порядок получение данных (Edit): View → ModelBinder → ViewModel → Controller/Action Полученные данные из View с помощью ModelBinder преобразуются в типизированную ViewModel и передаются действию контроллера. ViewModel, хранящий коллекцию brandIds не является никаким «полуфабрикатом», так всего лишь представляет данные, полученные с формы. Варианты реализации действия контроллера после получения данных: 1. «Толстый вариант» контроллера получить объект заявки из контекста пройтись по списку брендов в заявке и сравнить их ID с полученным списком во ViewModel удалить из заявки отсутствующие бренды в полученном списке во ViewModel добавить в заявку отсутствующие бренды в заявке, для этого по ID надо получить объект бренда из контекста и добавить в коллекцию брендов заявки 2. Правильный «тонкий» вариант контроллера преобразовать (например, с помощью маппинга) объект ViewModel в DTO для бизнес-логики передать объект DTO в метод обновления записи заявки сервиса бизнес-логики Ещё раз, ViewModel это вообще не бизнес-объект. Не фабрикат, недофабрикат или полуфабрикат. Это просто типизированные данные, полученные, например, из формы. Как эти данные засунуть в свою бизнес-логику, этим вопросом ASP.NET MVC не занимается, ничего для этого не предлагает, да и не должно. Проблема, с которой некоторые сталкиваются состоит в том, что они зачем-то используют в качестве ViewModel-ей классы контекста EF. Это всегда оборачивается жопой. Всегда. Не стоит так делать никогда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2015, 15:31 |
|
||
|
Как правильно работать с коллекциями в EF?
|
|||
|---|---|---|---|
|
#18+
MonochromatiqueЭто разумное количество кода? Если всех разработчиков (или тебя, если ты один) такое устраивает и это работает, то ок. Но я бы подобное не стал бы сопровождать в принципе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2015, 15:36 |
|
||
|
Как правильно работать с коллекциями в EF?
|
|||
|---|---|---|---|
|
#18+
Под полуфабрикатом я имел ввиду следующее: Объект, загруженный via LINQ с использованием INCLUDE для полей типа коллекции. Это я считаю как полноценный объект. Если объект, полученный с формы _нельзя_ получить СРАЗУ в виде описанному выше (через волшебные conventions и прочую магию) - то я это считаю полуфабрикатом. Но теперь понятно, что "подчиненные объекты" создаются без участия владельца объекта. Это привычка с 1С осталась - там в табличную часть справочника НЕЛЬЗЯ записать что-либо НЕ ЧЕРЕЗ объект владелец. В EF я думал, будет что-то похожее, но ошибся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2015, 15:54 |
|
||
|
Как правильно работать с коллекциями в EF?
|
|||
|---|---|---|---|
|
#18+
hVosttMonochromatiqueЭто разумное количество кода? Если всех разработчиков (или тебя, если ты один) такое устраивает и это работает, то ок. Но я бы подобное не стал бы сопровождать в принципе. Я хочу как правильно. Почему не стал бы сопровождать, да еще и в принципе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2015, 15:55 |
|
||
|
Как правильно работать с коллекциями в EF?
|
|||
|---|---|---|---|
|
#18+
[quot hVostt] добавить в заявку отсутствующие бренды в заявке, для этого по ID надо получить объект бренда из контекста и добавить в коллекцию брендов заявки Я вот об этом и говорил. Хм. То есть объект client_request_brands_car не нужен? EF этот класс сама создаст? И работать тогда придётся ТОЛЬКО через коллекцию объекта client_request? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2015, 16:01 |
|
||
|
Как правильно работать с коллекциями в EF?
|
|||
|---|---|---|---|
|
#18+
MonochromatiqueПод полуфабрикатом я имел ввиду следующее: Объект, загруженный via LINQ с использованием INCLUDE для полей типа коллекции. Это я считаю как полноценный объект. Если объект, полученный с формы _нельзя_ получить СРАЗУ в виде описанному выше (через волшебные conventions и прочую магию) - то я это считаю полуфабрикатом. Но теперь понятно, что "подчиненные объекты" создаются без участия владельца объекта. Это привычка с 1С осталась - там в табличную часть справочника НЕЛЬЗЯ записать что-либо НЕ ЧЕРЕЗ объект владелец. В EF я думал, будет что-то похожее, но ошибся. Include в EF этой убогий костыль, обсуждалось уже. Для доступа к навигационным свойствам объекта используется «ленивая загрузка» (lazy loading), с помощью ключевого слова virtual в объявлении навигационных свойств. Include не нужен. Для запроса больших объёмов коллекций лучше использовать отражения. MonochromatiqueЯ хочу как правильно. Почему не стал бы сопровождать, да еще и в принципе? Потому что отсутствует архитектура как таковая, ты работаешь с контекстом напрямую, прям из контроллера, кроме того дёргаешь очень специфичные методы и прокси-свойства объектов контекста, (Entry, EntityState, Include), что убивает на корню всякие архитектурные принципы. Таким способом сложно разрабатывать, крайне неприятно ковыряться в таком коде, отлаживать и искать ошибки, сопровождение будет связано с постоянной головной болью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2015, 16:57 |
|
||
|
Как правильно работать с коллекциями в EF?
|
|||
|---|---|---|---|
|
#18+
MonochromatiqueХм. То есть объект client_request_brands_car не нужен? EF этот класс сама создаст? И работать тогда придётся ТОЛЬКО через коллекцию объекта client_request? EF может создавать прозрачно таблицы связей М:М, при этом ты работаешь только с навигационным свойством - коллекцией, добавляя или удаляя оттуда зависимые объекты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2015, 16:59 |
|
||
|
Как правильно работать с коллекциями в EF?
|
|||
|---|---|---|---|
|
#18+
hVostt прям из контроллера. С чего ты взял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2015, 17:00 |
|
||
|
Как правильно работать с коллекциями в EF?
|
|||
|---|---|---|---|
|
#18+
hVostt Для доступа к навигационным свойствам объекта используется «ленивая загрузка» (lazy loading). А как она лениво загрузится, если контекста уже давно нет? Magic? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2015, 17:09 |
|
||
|
Как правильно работать с коллекциями в EF?
|
|||
|---|---|---|---|
|
#18+
Короче, я не знаю - как круто лениво загрузить связанные сущности. И как НЕ использовать (как там?) "очень специфичный метод" Entry - я тоже не понял. Вот код. Его можно улучшить? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2015, 19:18 |
|
||
|
Как правильно работать с коллекциями в EF?
|
|||
|---|---|---|---|
|
#18+
MonochromatiquehVostt Для доступа к навигационным свойствам объекта используется «ленивая загрузка» (lazy loading). А как она лениво загрузится, если контекста уже давно нет? Magic? А куда он делся? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2015, 14:17 |
|
||
|
Как правильно работать с коллекциями в EF?
|
|||
|---|---|---|---|
|
#18+
hVosttMonochromatiqueпропущено... А как она лениво загрузится, если контекста уже давно нет? Magic? А куда он делся? Lost in space. POCO он на то и POCO - хочу обратиться к свойству - изволь вспомнить про контекст. Не понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2015, 14:38 |
|
||
|
Как правильно работать с коллекциями в EF?
|
|||
|---|---|---|---|
|
#18+
MonochromatiqueLost in space. POCO он на то и POCO - хочу обратиться к свойству - изволь вспомнить про контекст. Не понимаю. Вообще-то EF возвращает объект прокси-класса, если специально не запретить ему этого. А в веб-приложении обычно делают контекст живым в рамках запроса, этого вполне хватает. Ну да ладно. Я просто высказал свои соображения на эту тему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2015, 14:59 |
|
||
|
Как правильно работать с коллекциями в EF?
|
|||
|---|---|---|---|
|
#18+
hVosttMonochromatiqueLost in space. POCO он на то и POCO - хочу обратиться к свойству - изволь вспомнить про контекст. Не понимаю. Вообще-то EF возвращает объект прокси-класса, если специально не запретить ему этого. А в веб-приложении обычно делают контекст живым в рамках запроса, этого вполне хватает. Ну да ладно. Я просто высказал свои соображения на эту тему. Мы про EF Code First говорим? Какой объект прокси класса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2015, 15:08 |
|
||
|
Как правильно работать с коллекциями в EF?
|
|||
|---|---|---|---|
|
#18+
MonochromatiquehVosttпропущено... Вообще-то EF возвращает объект прокси-класса, если специально не запретить ему этого. А в веб-приложении обычно делают контекст живым в рамках запроса, этого вполне хватает. Ну да ладно. Я просто высказал свои соображения на эту тему. Мы про EF Code First говорим? Какой объект прокси класса? Тут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2015, 15:20 |
|
||
|
Как правильно работать с коллекциями в EF?
|
|||
|---|---|---|---|
|
#18+
MonochromatiqueМы про EF Code First говорим? Какой объект прокси класса? Да хоть Code Zero https://msdn.microsoft.com/ru-ru/library/vstudio/dd456853(v=vs.100).aspx Cоздание прокси-объекта Чтобы платформа Entity Framework отслеживала изменения в классах POCO по мере их внесения и чтобы обеспечить поддержку отложенной загрузки связанных объектов, классы POCO должны соответствовать требованиям, описанным в разделе Требования к созданию прокси-сущностей POCO (платформа Entity Framework). Если создание прокси-объектов для сущностей POCO разрешено, то изменения, вносимые в граф и значения свойств объектов, отслеживаются платформой Entity Framework автоматически по мере их внесения. Сведения о параметрах отслеживания изменений с использованием и без использования прокси-объектов см. в разделе Отслеживание изменений в сущностях POCO (платформа Entity Framework). Можно использовать комбинацию сущностей POCO и прокси-объектов сущностей. Чтобы отключить создание прокси-объектов, установите свойство ProxyCreationEnabled в значение false для экземпляра ObjectContextOptions, возвращенного свойством ContextOptions объекта ObjectContext: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2015, 15:29 |
|
||
|
|

start [/forum/topic.php?fid=18&msg=38885137&tid=1356693]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
20ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 253ms |
| total: | 356ms |

| 0 / 0 |
