Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Как правильно работать с коллекциями в EF? / 20 сообщений из 20, страница 1 из 1
20.02.2015, 01:46
    #38884563
Monochromatique
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с коллекциями в EF?
Спрошу тут, так как ASP MVC тут - половина жары.

У меня с клиента пришла форма.

Объект заявка. В заявке перечислены бренды.
То есть - есть поле brandIds - где хранятся гуиды брендов.

brandIds в базу не сохраняется ("NotMapped").

Надо теперь эти гуиды брендов сохранить в базу, привязав к заявке.

Вопрос №1
Нет ли в ASP MVC каких-то телодвижений, которые преlпринимает сама плаnформа и превращает полуфабрикат объекта с распарсенной формы в полноценный объект, который осталось только запихнуть в контекст? То есть объект заявка с уже прилепленными к ней объектами вида заявка_бренд?

Вопрос №2
Если никакой магии нет, то как правильней запихнуть данные в базу? Я пока вижу только так:
(поскольку есть гуиды..)
1. Находим существующие бренды в заявке. (Объект заявка_бренд)
2. Стираем их. (Чтобы не парится с вычислением новых/старых)
3. Создаем новые.
4. Аттачим в составе заявки к контексту.
5. Сохраняем.
6. Как-то их потом читаем.

Как-то дофига движений..
Раньше я спецово в EF работал только с примитивными типами данных. И горя не знал.
Решил типа модно, со связями, а теперь чешу репу...
...
Рейтинг: 0 / 0
20.02.2015, 07:56
    #38884616
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с коллекциями в EF?
MonochromatiqueСпрошу тут, так как ASP MVC тут - половина жары.

У меня с клиента пришла форма.

Объект заявка. В заявке перечислены бренды.
То есть - есть поле brandIds - где хранятся гуиды брендов.

brandIds в базу не сохраняется ("NotMapped").

Надо теперь эти гуиды брендов сохранить в базу, привязав к заявке.

Вопрос №1
Нет ли в ASP MVC каких-то телодвижений, которые преlпринимает сама плаnформа и превращает полуфабрикат объекта с распарсенной формы в полноценный объект, который осталось только запихнуть в контекст? То есть объект заявка с уже прилепленными к ней объектами вида заявка_бренд?

Вопрос №2
Если никакой магии нетМагии нет, есть ModelBinder

Monochromatiqueкак правильней запихнуть данные в базу?Ну либо отдельной командой, либо сформированный таки объект передать в репозиторий и внутри последнего уже разбираться с EF, или чем-то другим.
...
Рейтинг: 0 / 0
20.02.2015, 15:30
    #38885137
Monochromatique
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с коллекциями в EF?
Путем нечеловеческого напряжения мозгов - я понял как работает EF. В принципе - подчинить логике можно.

Вот код. Делает то, что нужно. Но не нравится количество. Его можно сократить?
Только не прописывать в ModelBinder ничего.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 // client_request.requested_brandsIDs - тут ID брендов

                db.Entry(client_request).State = EntityState.Modified; //вытаскиваем сущность в контекст. Почему то кодом, что строчкой ниже - она вытаскивается не хочет. 

                db.Entry(client_request).Collection<client_request_brand_car>(ent => ent.requested_brands).Load(); //Загружаем в контекст старые записи

                db.table_client_request_brand_cars.RemoveRange(client_request.requested_brands); //Удаляем старые записи

                client_request.requested_brandsIDs.ToList().ForEach(brandID => db.table_client_request_brand_cars.Add(new client_request_brand_car() { brand_carID = brandID, id = Guid.NewGuid(), requestID = client_request.id }));
                //Создаем новые записи и добавляем их в контекст

                db.SaveChanges();




Это разумное количество кода?
...
Рейтинг: 0 / 0
20.02.2015, 15:31
    #38885139
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с коллекциями в EF?
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. Это всегда оборачивается жопой. Всегда. Не стоит так делать никогда.
...
Рейтинг: 0 / 0
20.02.2015, 15:36
    #38885146
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с коллекциями в EF?
MonochromatiqueЭто разумное количество кода?

Если всех разработчиков (или тебя, если ты один) такое устраивает и это работает, то ок. Но я бы подобное не стал бы сопровождать в принципе.
...
Рейтинг: 0 / 0
20.02.2015, 15:54
    #38885176
Monochromatique
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с коллекциями в EF?
Под полуфабрикатом я имел ввиду следующее:
Объект, загруженный via LINQ с использованием INCLUDE для полей типа коллекции. Это я считаю как полноценный объект.

Если объект, полученный с формы _нельзя_ получить СРАЗУ в виде описанному выше (через волшебные conventions и прочую магию) - то я это считаю полуфабрикатом.

Но теперь понятно, что "подчиненные объекты" создаются без участия владельца объекта.
Это привычка с 1С осталась - там в табличную часть справочника НЕЛЬЗЯ записать что-либо НЕ ЧЕРЕЗ объект владелец.
В EF я думал, будет что-то похожее, но ошибся.
...
Рейтинг: 0 / 0
20.02.2015, 15:55
    #38885177
Monochromatique
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с коллекциями в EF?
hVosttMonochromatiqueЭто разумное количество кода?

Если всех разработчиков (или тебя, если ты один) такое устраивает и это работает, то ок. Но я бы подобное не стал бы сопровождать в принципе.

Я хочу как правильно. Почему не стал бы сопровождать, да еще и в принципе?
...
Рейтинг: 0 / 0
20.02.2015, 16:01
    #38885191
Monochromatique
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с коллекциями в EF?
[quot hVostt]
добавить в заявку отсутствующие бренды в заявке, для этого по ID надо получить объект бренда из контекста и добавить в коллекцию брендов заявки

Я вот об этом и говорил.

Хм. То есть объект client_request_brands_car не нужен? EF этот класс сама создаст? И работать тогда придётся ТОЛЬКО через коллекцию объекта client_request?
...
Рейтинг: 0 / 0
20.02.2015, 16:57
    #38885252
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с коллекциями в EF?
MonochromatiqueПод полуфабрикатом я имел ввиду следующее:
Объект, загруженный via LINQ с использованием INCLUDE для полей типа коллекции. Это я считаю как полноценный объект.

Если объект, полученный с формы _нельзя_ получить СРАЗУ в виде описанному выше (через волшебные conventions и прочую магию) - то я это считаю полуфабрикатом.

Но теперь понятно, что "подчиненные объекты" создаются без участия владельца объекта.
Это привычка с 1С осталась - там в табличную часть справочника НЕЛЬЗЯ записать что-либо НЕ ЧЕРЕЗ объект владелец.
В EF я думал, будет что-то похожее, но ошибся.

Include в EF этой убогий костыль, обсуждалось уже.

Для доступа к навигационным свойствам объекта используется «ленивая загрузка» (lazy loading), с помощью ключевого слова virtual в объявлении навигационных свойств. Include не нужен. Для запроса больших объёмов коллекций лучше использовать отражения.

MonochromatiqueЯ хочу как правильно. Почему не стал бы сопровождать, да еще и в принципе?

Потому что отсутствует архитектура как таковая, ты работаешь с контекстом напрямую, прям из контроллера, кроме того дёргаешь очень специфичные методы и прокси-свойства объектов контекста, (Entry, EntityState, Include), что убивает на корню всякие архитектурные принципы. Таким способом сложно разрабатывать, крайне неприятно ковыряться в таком коде, отлаживать и искать ошибки, сопровождение будет связано с постоянной головной болью.
...
Рейтинг: 0 / 0
20.02.2015, 16:59
    #38885253
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с коллекциями в EF?
MonochromatiqueХм. То есть объект client_request_brands_car не нужен? EF этот класс сама создаст? И работать тогда придётся ТОЛЬКО через коллекцию объекта client_request?

EF может создавать прозрачно таблицы связей М:М, при этом ты работаешь только с навигационным свойством - коллекцией, добавляя или удаляя оттуда зависимые объекты.
...
Рейтинг: 0 / 0
20.02.2015, 17:00
    #38885255
Monochromatique
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с коллекциями в EF?
hVostt прям из контроллера.

С чего ты взял?
...
Рейтинг: 0 / 0
20.02.2015, 17:09
    #38885264
Monochromatique
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с коллекциями в EF?
hVostt Для доступа к навигационным свойствам объекта используется «ленивая загрузка» (lazy loading).

А как она лениво загрузится, если контекста уже давно нет? Magic?
...
Рейтинг: 0 / 0
20.02.2015, 19:18
    #38885378
Monochromatique
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с коллекциями в EF?
Короче, я не знаю - как круто лениво загрузить связанные сущности.
И как НЕ использовать (как там?) "очень специфичный метод" Entry - я тоже не понял.

Вот код.

Его можно улучшить?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
db.client_requests.Attach(client_request); //Аттачим к контексту сущность.

                db.Entry(client_request).Collection(x => x.requested_brands).Load(); //Грузим связанные данные

                client_request.requested_brands.Select(x => client_request.requested_brands.Remove(x)); //Удаляем всё что загрузили

                client_request.requested_brandsIDs = client_request.requested_brandsIDs == null ? new Guid[0] : client_request.requested_brandsIDs; //Вдруг список с формы пришел пустой? 

                client_request.requested_brands = client_request.requested_brandsIDs.Select(id => db.car_brands.FirstOrDefault(car_brand => car_brand.id == id)).ToList(); //Заносим в новую коллекцию бренды
...
Рейтинг: 0 / 0
21.02.2015, 14:17
    #38885626
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с коллекциями в EF?
MonochromatiquehVostt Для доступа к навигационным свойствам объекта используется «ленивая загрузка» (lazy loading).

А как она лениво загрузится, если контекста уже давно нет? Magic?

А куда он делся?
...
Рейтинг: 0 / 0
21.02.2015, 14:38
    #38885633
Monochromatique
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с коллекциями в EF?
hVosttMonochromatiqueпропущено...


А как она лениво загрузится, если контекста уже давно нет? Magic?

А куда он делся?

Lost in space. POCO он на то и POCO - хочу обратиться к свойству - изволь вспомнить про контекст. Не понимаю.
...
Рейтинг: 0 / 0
21.02.2015, 14:59
    #38885645
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с коллекциями в EF?
MonochromatiqueLost in space. POCO он на то и POCO - хочу обратиться к свойству - изволь вспомнить про контекст. Не понимаю.

Вообще-то EF возвращает объект прокси-класса, если специально не запретить ему этого. А в веб-приложении обычно делают контекст живым в рамках запроса, этого вполне хватает. Ну да ладно. Я просто высказал свои соображения на эту тему.
...
Рейтинг: 0 / 0
21.02.2015, 15:08
    #38885649
Monochromatique
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с коллекциями в EF?
hVosttMonochromatiqueLost in space. POCO он на то и POCO - хочу обратиться к свойству - изволь вспомнить про контекст. Не понимаю.

Вообще-то EF возвращает объект прокси-класса, если специально не запретить ему этого. А в веб-приложении обычно делают контекст живым в рамках запроса, этого вполне хватает. Ну да ладно. Я просто высказал свои соображения на эту тему.

Мы про EF Code First говорим? Какой объект прокси класса?
...
Рейтинг: 0 / 0
21.02.2015, 15:20
    #38885654
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с коллекциями в EF?
MonochromatiquehVosttпропущено...


Вообще-то EF возвращает объект прокси-класса, если специально не запретить ему этого. А в веб-приложении обычно делают контекст живым в рамках запроса, этого вполне хватает. Ну да ладно. Я просто высказал свои соображения на эту тему.

Мы про EF Code First говорим? Какой объект прокси класса? Тут
...
Рейтинг: 0 / 0
21.02.2015, 15:29
    #38885657
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с коллекциями в EF?
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:
...
Рейтинг: 0 / 0
21.02.2015, 17:34
    #38885696
Monochromatique
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно работать с коллекциями в EF?
hVosttMonochromatiqueМы про EF Code First говорим? Какой объект прокси класса?

Да хоть Code Zero [/quot]

Database first и Model First - вне контекста обсуждения.
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Как правильно работать с коллекциями в EF? / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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