powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Клонирование графа сущностей в EF
17 сообщений из 17, страница 1 из 1
Клонирование графа сущностей в EF
    #39657451
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EF Core, CodeFirst

Нужно получить клон сущности с клонами связанных сущностей.
Точнее почти со всеми.
К примеру (сразу подчеркиваю, пример условный) клонируем заказ пользователя, нужно также получить клон всех номенклатурных позиций с ценами заказа (корзина, условно говоря), но при этом ссылки на номенклатурный справочник остаются, то есть записи номенклатурного справочника клонированию не подлежат.

Дополнительно:
- в процессе клонирования нужно изменить некоторые поля в некоторых сущностях (к примеру дату)
- задача осложняется тем, что есть циклические ссылки, то есть если сделать втупую глубокое копирование, оно просто зациклится, нужно учитывать уже клонированные объекты.

Описание, что нужно клонировать, какие ссылки сохранять, какие поля поменять, можно было бы описать с помощью атрибутов на свойствах сущностей или на самих сущностях.


Кто-нибудь решал такую задачу, может есть какие-то готовые инструменты?

Думал, может автомаппер приспособить, но с учетом требований мне кажется, это будет выглядеть громоздко, проще свой инструмент написать.
...
Рейтинг: 0 / 0
Клонирование графа сущностей в EF
    #39657547
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попробовать создать второй экземпляр контекста и приаттачить к нему граф обьектов загруженных в первом контексте как новые обьекты.
...
Рейтинг: 0 / 0
Клонирование графа сущностей в EF
    #39657672
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,
Можно и не аттачить. Простой второй контекст).
А ещё лучше денормализация через проекцию.
Спроецировать новые типы без справочников на млн.позиций.
...
Рейтинг: 0 / 0
Клонирование графа сущностей в EF
    #39657691
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatМожно попробовать создать второй экземпляр контекста и приаттачить к нему граф обьектов загруженных в первом контексте как новые обьекты.Интересная мысль. По идее, достаточно просто загрузить корневую сущность со всеми необходимыми инклюдами, потом пройтись по всем объектам контекста, стирая им Id и отключая от контекста, а потом добавить корневую сущность как новую, можно прямо в тот же контекст.
Или можно просто загрузить AsNoTracking и передобавить в контекст. Правда стирать ID-шники придется после добавления в контекст, потому как нужно как-то получить список сущностей.
...
Рейтинг: 0 / 0
Клонирование графа сущностей в EF
    #39657700
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
dbContext.Entry(entity).State = EntityState.Detached;
Зачем этот гимор, дело ваше.
...
Рейтинг: 0 / 0
Клонирование графа сущностей в EF
    #39657765
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProКто-нибудь решал такую задачу, может есть какие-то готовые инструменты?

Самый в доску тупой, но достаточно хорошо сопровождаемый и надёжный, это маппинг (например, AutoMapper)

Entity → DTO
DTO → Entity

Но коли клонирование это стабильная операция, то можно её сделать операцией клонирования, с прописанной в ней логикой. Где размещаешь свою логику? Сервисы? Команды? Воркеры? Вот там и опиши.
...
Рейтинг: 0 / 0
Клонирование графа сущностей в EF
    #39657767
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatМожно попробовать создать второй экземпляр контекста и приаттачить к нему граф обьектов загруженных в первом контексте как новые обьекты.

Это самый плохой сценарий, который учитывает подробности реализации репозитория. Сопровождаться будет плохо, и пахет уже на взлёте отвратительно.
...
Рейтинг: 0 / 0
Клонирование графа сущностей в EF
    #39657771
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНо коли клонирование это стабильная операция, то можно её сделать операцией клонирования, с прописанной в ней логикой. Где размещаешь свою логику? Сервисы? Команды? Воркеры? Вот там и опиши.Я так и сделал для одного из графов, но задолбался и решил поискать способ попроще.
И опять же - из-за циклических ссылок тупой маппинг не подходит, пришлось делать еще и кеш клонированных сущностей, чтобы не дублировать их.
...
Рейтинг: 0 / 0
Клонирование графа сущностей в EF
    #39657780
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttСамый в доску тупой, но достаточно хорошо сопровождаемый и надёжный, это маппинг (например, AutoMapper)

Entity → DTO
DTO → EntityА тут придется объяснять мапперу, что требуется клонировать, что не требуется. В случае автомаппера это будут коллбэки и наглядность будет совсем не на высоте.
...
Рейтинг: 0 / 0
Клонирование графа сущностей в EF
    #39657789
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

AutoMapper?
...
Рейтинг: 0 / 0
Клонирование графа сущностей в EF
    #39657793
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProА тут придется объяснять мапперу, что требуется клонировать, что не требуется. В случае автомаппера это будут коллбэки и наглядность будет совсем не на высоте.

Почему, конфигурация маппинга.

Конструктор, принимающий экземпляр своего типа для сущности, не рассматривал?
...
Рейтинг: 0 / 0
Клонирование графа сущностей в EF
    #39657804
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttAutoMapper?да
hVosttПочему, конфигурация маппинга.придется пилить конфигурацию под каждый конкретный граф, а этого не хочется. Если же делать через атрибуты свойств сущности, то придется приделать к мапперу еще и логику
hVosttКонструктор, принимающий экземпляр своего типа для сущности, не рассматривал?ну почти. Я просто сделал метод Clone() у сущности.

Но в обоих случаях проблема опять же в циклических ссылках, их нужно учитывать, что в маппере, что в клонировании. Иначе бесконечный цикл и StackOverflow. А вот EF умеет это автоматом, вот что привлекательно.
...
Рейтинг: 0 / 0
Клонирование графа сущностей в EF
    #39657807
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttShocker.Pro,

AutoMapper?

Автомеппер, афайк, не разрулит циклические ссылки.
...
Рейтинг: 0 / 0
Клонирование графа сущностей в EF
    #39657815
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthathVosttShocker.Pro,

AutoMapper?

Автомеппер, афайк, не разрулит циклические ссылки.пример приведи циклической.
...
Рейтинг: 0 / 0
Клонирование графа сущностей в EF
    #39657819
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proвот EF умеет это автоматом,в маппинге есть направления связей.
...
Рейтинг: 0 / 0
Клонирование графа сущностей в EF
    #39657838
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatАвтомеппер, афайк, не разрулит циклические ссылки.

jbogardAutoMapper works OK if the destination objects overload .Equals, have you tried that?

https://github.com/AutoMapper/AutoMapper/issues/314
...
Рейтинг: 0 / 0
Клонирование графа сущностей в EF
    #39657861
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ответ 2013 года.

А вот посвежее
Circular references
Previously, AutoMapper could handle circular references by keeping track of what was mapped, and on every mapping, check a local hashtable of source/destination objects to see if the item was already mapped. It turns out this tracking is very expensive, and you need to opt-in using PreserveReferences for circular maps to work. Alternatively, you can configure MaxDepth:

// Self-referential mapping
cfg.CreateMap<Category, CategoryDto>().MaxDepth(3);

// Circular references between users and groups
cfg.CreateMap<User, UserDto>().PreserveReferences();
Starting from 6.1.0 PreserveReferences is set automatically at config time whenever the recursion can be detected statically. If that doesn't happen in your case, open an issue with a full repro and we'll look into it.
http://docs.automapper.org/en/v6.2.2/5.0-Upgrade-Guide.html?#circular-references
...
Рейтинг: 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]