Рекурсивное присоединение в Entity Framework - PullRequest
1 голос
/ 27 октября 2019

Давайте предположим, что у меня есть две сущности, Folder и File, и это их упрощенная структура:

File
    public virtual Folder ParentFolder

Folder
    public virtual List<File> Files

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

var file = new File (fileModel);
var folder = context.Attach (GetFromInMemoryCacheById (fileModel.FolderId));
file.ParentFolder = folder;
folder.Files.Add (file);
context.SaveChanges ();

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

folder.Files.ForEach (file => context.Attach (File));

Но теперь изображение моей структуры немного больше, и у меня есть еще один слой,например Disk. Внезапно, даже для самого простого действия сохранения мне нужно пройти через множество сущностей, чтобы привести их в состояние Unchanged, и это действительно очень быстро вышло из-под контроля.

Какой подходящий способ сделать DbContext заботится только о File и его родителе Folder, но полностью игнорирует список Files, который у него есть, так что мне не придется все время исправлять их состояния?

1 Ответ

0 голосов
/ 31 октября 2019

Не хотел портить идентификаторы или устанавливать что-либо в null, которое не должно быть нулевым, поэтому я в итоге установил [NotMapped] на public virtual List<File> Files. Я пожертвовал удобством установки этого свойства при загрузке папки из базы данных (мне приходится делать это вручную, но операция загрузки выполняется очень редко, в основном меня интересует непрерывное сохранение), но теперь неожиданные объекты больше не попадают в область действия. Надеюсь, этот подход полезен для других, имеющих дело с асинхронным сохранением в EF.

...