none
Сохарнение вложенных объектов в Entity Framework RRS feed

  • Вопрос

  • Собственно, есть модели данных которые заданы третьей стороной, их много. Особенностью этих моделей является то, что сущности могут в себе содержать другие сущности, которые так же отображаются на БД. Вот один из примеров:

    public class Region
    {
        public int Id { get; set; }
        
        public string Name { get; set; }
    
        public int? ParentId { get; set; }
    
        [ForeignKey(nameof(ParentId))]
        public Region Parent { get; set; }
    }

    И в случае вставки региона второго уровня возникает ошибка:
    System.InvalidOperationException: "The instance of entity type 'Region' cannot be tracked because another instance with the key value '{id: 1}' is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached."

    Что можно сделать в такой ситуации? Учитывая сложность структуры, можно пожертвовать производительностью.

    В качестве СУБД используем PostgreSQL, если это можно с UPSERT решить, то вообще здорово.

    9 декабря 2021 г. 6:42

Все ответы

  • Здравствуйте,

    Посмотрите здесь ответ Rudi Visser, не знаю таже ли самая ситуация у Вас, быть может будет в пользу:


    Если Вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение" Мнения, высказанные здесь, являются отражение моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.

    9 декабря 2021 г. 11:21
    Модератор
  • В общем, установлено, что если где-либо в процессе выполнения программы фигурируют два экземпляра объекта с одинаковым идентификатором (Id, например), то будет возникать выше упомянутая ошибка.

    Это не лечится принудительным отключением трекинга в конструкторе контекста, либо ещё где либо:

    db.ChangeTracker.AutoDetectChangesEnabled = false;

    Никакие операции с детекцией изменений также не помогают:

    db.ChangeTracker.DetectChanges();

    Как обыгрывать то...

    13 декабря 2021 г. 7:31