EF Core «еще один экземпляр уже отслеживается»C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 EF Core «еще один экземпляр уже отслеживается»

Сообщение Anonymous »

У меня возникла проблема с обновлением объекта в .Net Core 2.2.0 с помощью EF Core 2.2.3.


Произошла ошибка при сохранении изменений. Подробности об ошибке:
Экземпляр типа сущности «Актив» не может быть отслежен, поскольку другой экземпляр с тем же значением ключа для {'Id'} уже отслеживается. При присоединении существующих сущностей убедитесь, что присоединен только один экземпляр сущности с заданным значением ключа. Рассмотрите возможность использования


Вот как регистрируется контекст БД:

services .AddDbContext(options =>

Код: Выделить всё

options.UseSqlServer(Configuration.GetConnectionString("DbConnection")), ServiceLifetime.Scoped);
Время существования установлено по умолчанию, но я написал его, чтобы было легче понять.

Объект Anomaly получается следующим образом:

Код: Выделить всё

public IQueryable GetAll()
{return _context.Anomalies.Include(a => a.Asset).Include(a => a.Level)
}

public async Task GetAnomaly(int anomalyId, User user)
{
var anomaly = await GetAll()
.FirstOrDefaultAsync(a => a.Id == anomalyId);

return anomaly;
}
А метод Update() выглядит так:

Код: Выделить всё

using (var transaction = _context.Database.BeginTransaction())
{
try
{
_context.Anomalies.Update(anomaly);
_context.SaveChanges();

transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
throw;
}
}
Он содержит некоторые проверки перед этой транзакцией, но ни одна из них не является достаточно актуальной в данном контексте.

Здесь я получаю сообщение об ошибке: экземпляр уже отслеживается. Я не могу понять, как это происходит.. Если контекст Scoped, то


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


Если мой контекст в запросе PUT отличается из контекста запроса GET, как объект уже отслеживается? Как это работает на самых базовых уровнях?

Единственный способ заставить это работать — установить состояние для всех записей из ChangeTracker в EntityState. Отдельный. Тогда это работает... но это не имеет смысла, по крайней мере, насколько мне известно на данный момент.

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




ОБНОВЛЕНИЕ
Вот ссылка на bitbucket с примером, воссоздающим эту проблему: Обновление EF Core Пример


Я сериализовал объекты, полученные из контекста.

С отслеживанием СЛЕВА Без отслеживания СПРАВА
[img]https://i .sstatic.net/9N9vK.png[/img]


Подробнее здесь: https://stackoverflow.com/questions/562 ... ng-tracked
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»