Клонирование объекта вместе со всеми сопоставленными объектами
Мне нужен надежный способ клонирования существующего объекта вместе со всеми объектами, которые сопоставляются с ним через свойства навигации.
Например, если у меня есть сущность "заказ" с адресами доставки и выставления счетов, списком позиций заказа, каждая из которых имеет прикрепленный статус (и так далее), я хотел бы сделать глубокую копию сущности и всего, что к ней прикреплено, и сохранить ее в базе данных в виде новых строк данных в соответствующих таблицах за один раз. Я мог бы обмануть 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