UpdateAsync 出错 The instance of entity type '' cannot be tracked because another instance with the same key value for {'Id'} is already being tracked.
场景:
当我们重写UpdateAsync的时候,基本的操作:
1、传入更新的数据;
2、根据传入的ID,查询到实体;
3、根据实体中的条件判断是否要更新数据,比如“报关单状态改变”,状态改变,就将传入的更新数据,赋值给实体;
4、调用UpdateAsync,进行更新
错误:
The instance of entity type 'menu' cannot be tracked because another instance with the same key value for {'Id'} is already being tracked.
谷歌翻译:
无法跟踪实体类型'menu'的实例,因为已经跟踪了另一个具有相同'{'Id'}键值的实例.附加现有实体时,请确保仅附加一个具有给定键值的实体实例.
解决方法:
这个问题,是 EF Core 对实体默认进行状态跟踪造成的,说的高大上一点,叫:线程安全 导致的,
解决方法很简单,即:对读取的数据不进行跟踪即可!可以使用 AsNoTracking 属性,也可以手动控制!
//查询这条报关单的数据,是否有 STKForm.STKFormHead formheadExist = _Repository.GetAll().Where(x => x.entryId == formhead.entryId && x.IsDeleted == false).AsNoTracking().FirstOrDefault(); //AsNoTracking加上之后,UpdateAsync不会报错,不然会报