CodeWraith Ответов: 1

Клонирование объекта вместе со всеми сопоставленными объектами


Мне нужен надежный способ клонирования существующего объекта вместе со всеми объектами, которые сопоставляются с ним через свойства навигации.

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

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

Edit: как оказалось, мне вообще не нужно копировать сущности. Очевидно, все, что требуется для клонирования одного объекта, - это добавить его снова. Теперь вопрос в том, что происходит с отображенными сущностями. Будут ли они также клонированы, а идентификаторы и внешние ключи скорректированы или нет?

Что я уже пробовал:

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

Richard Deeming

Клонирования сущностей будет недостаточно. Вам также нужно будет сбросить ключи, чтобы позволить EF / SQL назначить новые.

CodeWraith

Именно этого я и боялся. Я должен написать специальный код, который должен быть адаптирован, когда происходят изменения в схеме данных. Забудьте об этом, и у нас будет новый отчет об ошибке и взволнованный клиент. Слишком много из этого может сделать поддержание приложения адом.

G3Coder

Привет,

Изо всех сил стараюсь следовать, но нужен ли вам способ выяснить, что в схеме БД сломает вашу копию - так, например, уникальный ключ?

Г

CodeWraith

Нет, не знаем. Я мог бы легко написать код, который специально создает клон сущности и все дальнейшие сущности, сопоставленные с ней. Затем в один прекрасный день кто-то должен реализовать новую функцию, сопоставив еще одну сущность с этой схемой.

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

То, что я хотел бы, - это нечто вроде сущности.Метод Clone (), который автоматически клонирует сущность и все сущности, сопоставленные с ней, и сохраняет их в виде новых строк в соответствующих таблицах.

TeknoKenar

Я задавался вопросом, ответы.

Gerry Schmitz

Вы создаете переопределение метода "MemberwiseClone" (глубокий Клон) для каждой сущности.

Вы читаете весь "объектный граф" того, что должно быть клонировано в память.

Затем вы выполняете итерацию по объектному графу; вызываете MemberwiseClone для каждой сущности / объекта; строите новый объектный граф.

У вас есть несколько других вариантов, так как вы "глубоко клонируете", и нет никакого "дефолта", который "глубоко клонирует" должным образом; т. е. вызывает правильный конструктор(ы).

Другой вариант-сериализовать в XML; изменить "данные"; затем десериализовать из XML (обратно) в объектный граф, который можно добавить в EF.

(На самом деле, просто прочитайте "отсоединенный" / без отслеживания, измените ключи, а затем добавьте и сохраните "новый" граф объектов).

https://stackoverflow.com/questions/5599147/how-do-i-detach-objects-in-entity-framework-code-first

1 Ответов

Рейтинг:
1

johannesnestler

Hmm - Maybe not an solution. But a few thoughts: I do the architecture of some big data-driven applications. I use EF as OR-Mapper. There are a lot of ways to solve this "cloning". But I wouldn't try to find a generic solution (it's kind of impossible to make it perfect - just think about dependency-rings, so you end up building EF again…) So I'd go for a solution to create new objects specific for each type where it's clear what will be new, what will be referenced what is optional and so on. Don't even think about real copy of an original graph (what about lazy loading, you may don't have the whole graph in memory etc. you'd do roundtrips to the database and so on).
Я сделал много решений без клонирования сущностей, и если у вас есть хорошая реляционная модель (возможно, с некоторым наследованием на стороне базы данных), вы получите несколько четких, типизированных "новых"методов (которые можно было бы реализовать с помощью .Чистые дженерики, чтобы избежать дублирования, для аналогичных структурированных объектных графов).

Так что в вашем случае это явный "новый" метод… с необходимыми параметрами будет достаточно, это может быть UI-функция, чтобы затем заполнить параметры из существующего графика в памяти - так что пользователи будут воспринимать эту операцию как "копирование"...


Только мой 2С...


BillWoodruff

+5