powered by simpleCommunicator - 2.0.33     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Копирование объекта
7 сообщений из 7, страница 1 из 1
Копирование объекта
    #39899522
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EF6. MsSQL2017
Есть объект Order. По сути это заказ.
OrderId -PK

Нужно его скопировать
Хотелось бы примерно так
Код: sql
1.
2.
3.
4.
5.
6.
7.
            Order order = db.Orders.Find(id);
            Order newOrder = new Order();

            newOrder = order;
            newOrder.OrderId = 0;

            db.Orders.Add(newOrder);


Но не дает добавить
Код: sql
1.
System.InvalidOperationException: "Свойство "OrderId" является частью данных ключа объекта, поэтому его нельзя изменить. "


И приходится просто все поля order присваивать newOrder.
Есть ли более элегантный выход?
...
Рейтинг: 0 / 0
Копирование объекта
    #39899524
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторИ приходится просто все поля order присваивать newOrder.
Да. Потому что две разных ссылки на один объект и два разных объекта это совершенно разные вещи.

авторЕсть ли более элегантный выход?
Нет. Иначе был бы элегантный способ клонирования людей просто выдавая им новые паспорта (ID). Единственное что можно посоветовать - возьми AutoMapper - в случае копирования большого количества свойств он большую часть работы сделает за тебя сам.
...
Рейтинг: 0 / 0
Копирование объекта
    #39899529
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

Спасибо.
Уже и сам понял.
Да просто много тупых слов в коде, хотел сократить)))

Оставлю как есть. Просто сделаю отдельным методом, что бы логику основную не засорять
...
Рейтинг: 0 / 0
Копирование объекта
    #39899537
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле можно сделать так, как ты хочешь
Код: c#
1.
2.
3.
4.
            Order newOrder = db.Orders.AsNoTracking().Find(id);
            newOrder.OrderId = 0;

            db.Orders.Add(newOrder);

Что-то типа того.
...
Рейтинг: 0 / 0
Копирование объекта
    #39899542
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Да, в принципе, можно даже и затреканную сущность отаттачить, сбросить ИД, а потом приаттачить как новую, но это все какие-то перверсии. Сущность есть сущность, хочешь новую сущность - создавай уже тогда по-нормальному новую сущность, а то иначе это как ипотеку по другому паспорту получать.

Как вариант быстрого клонирования, если AutoMapper совсем уж претит по каким-то непонятным причинам, можно (с определенными ограничениями):

Код: c#
1.
2.
Foo foo = ....
var clone = JsonSerializer.Deserialize<Foo>(JsonSerializer.Serializer(foo));
...
Рейтинг: 0 / 0
Копирование объекта
    #39899544
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Как вариант быстрого клонирования, если AutoMapper совсем уж претит по каким-то непонятным причинам, можно (с определенными ограничениями):
ничем не отличается от автомаппера по сути ))
Да, автомаппер может быть неудобен в некоторых случаях.


fkthat
Да, в принципе, можно даже и затреканную сущность отаттачить, сбросить ИД, а потом приаттачить как новую, но это все какие-то перверсии.
Да это тоже мало отличается от AsNoTracking.
fkthat
это как ипотеку по другому паспорту получать.
Вот у тебя сравнения нелепые )
ID сбросил - всё, это новая сущность. неважно, как ты ее инициализировал.
Для плоской сущности разницы нет, надо смотреть, какие там зависимости будут тянуться, и не сломается ли бизнес-логика при клонировании тем или иным способом.
...
Рейтинг: 0 / 0
Копирование объекта
    #39899551
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
ID сбросил - всё, это новая сущность. неважно, как ты ее инициализировал.

Имхо, с т.з. ОО и прочего ДДД, ИД сущности - это, скорее, указатель на неё. А ИД в виде какого-то целого или гуидного или т.п. поля - это просто что-то типа костыля, для осуществления айдентити-меппинга на запись в базе. В совершенно "идеальном" ОРМе, которым где-то, наверное, пользуются розовые пони-разработчики, каких-либо ИДшек базы в самой объектной модели вообще быть не должно.

Автомеппер неудобен ровно настолько же, насколько неудобна стамеска, когда ей шурупы заворачивают. Для меня автомеппер это просто "тупая" тулза, которая сокращает затраты на написание кода копирования чего-либо во что-либо, а проблемы с ним начинаются как раз тогда, когда его пытаются заставить что-то более интеллектуальное делать.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Копирование объекта
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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