Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Копирование объекта / 7 сообщений из 7, страница 1 из 1
08.12.2019, 10:34
    #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
08.12.2019, 10:45
    #39899524
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование объекта
авторИ приходится просто все поля order присваивать newOrder.
Да. Потому что две разных ссылки на один объект и два разных объекта это совершенно разные вещи.

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

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

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

            db.Orders.Add(newOrder);

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

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

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

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


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

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

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


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