Как освободить отслеживаемые объекты? - PullRequest
0 голосов
/ 20 марта 2019

Надеюсь, следующий фрагмент кода достаточно понятен, чтобы объяснить проблему. _db является экземпляром DbContext.

// this scenario is only for learning purpose
Author a = _db.Authors.Find(1831);
int id = a.AuthorId;
a = null;

Author stub = new Author { AuthorId = id };
_db.Remove(stub);
_db.SaveChanges();

Код выше производит

'Экземпляр типа сущности' Author 'не может быть отслежен, поскольку другой экземпляр с тем же значением ключа для {' AuthorId '} уже отслеживается. При подключении существующих объектов убедитесь, что подключен только один экземпляр объекта с данным значением ключа. Попробуйте использовать 'DbContextOptionsBuilder.EnableSensitiveDataLogging', чтобы увидеть конфликтующие значения ключа. '

Вопрос

Как освободить a от отслеживания?

Ответы [ 3 ]

2 голосов
/ 20 марта 2019

Вы можете попробовать AsNoTracking().
_db.Authors.AsNoTracking (). Где (a => a.AuthorId == 1831) .FirstOrDefault ();

1 голос
/ 21 марта 2019

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

_db.Entry(a).State = EntityState.Detached

В качестве плюса это не требует изменения каких-либодругой код, включая, однако, вы извлекли сам объект.

Эта строка очень ясно указывает на намерения.Это также позволяет следующее:

  1. Извлечение сущности или списка сущностей
  2. Выполнение различных типов работы
  3. Отсоединение сущности

Мне не нравится идея изменить существующие запросы на DbContext, когда все, что я хочу сделать, это отсоединить что-то.

1 голос
/ 20 марта 2019

Вы должны использовать опцию AsNoTracking при запросе для.

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

var blogs = context.Blogs
        .AsNoTracking()
        .ToList();

Вы можете установить AsNoTracking либо по запросу, либо его также можно установить для объекта контекста, как показано ниже:

context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;

var blogs = context.Blogs.ToList();

Это должно помочь вам решить эту проблему.

Подробнее см. на этой странице MSDN .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...