/// <summary>
        ///     This API supports the Entity Framework Core infrastructure and is not intended to be used
        ///     directly from your code. This API may change or be removed in future releases.
        /// </summary>
        public virtual void StopTracking(InternalEntityEntry entry)
        {
            if (_needsUnsubscribe)
            {
                _internalEntityEntrySubscriber.Unsubscribe(entry);
            }

            var entityType = entry.EntityType;
            var mapKey     = entry.Entity ?? entry;

            if (entityType.HasDefiningNavigation())
            {
                var entries = _dependentTypeReferenceMap[entityType];
                entries.Remove(mapKey);
                if (entries.Count == 0)
                {
                    _dependentTypeReferenceMap.Remove(entityType);
                }
            }
            else
            {
                _entityReferenceMap.Remove(mapKey);
            }

            foreach (var key in entityType.GetKeys())
            {
                FindIdentityMap(key)?.Remove(entry);
            }

            if (_referencedUntrackedEntities.HasValue)
            {
                var navigations = entityType.GetNavigations().ToList();

                foreach (var keyValuePair in _referencedUntrackedEntities.Value.ToList())
                {
                    var untrackedEntityType = _model.FindRuntimeEntityType(keyValuePair.Key.GetType());
                    if (navigations.Any(n => n.GetTargetType().IsAssignableFrom(untrackedEntityType)) ||
                        untrackedEntityType.GetNavigations().Any(n => n.GetTargetType().IsAssignableFrom(entityType)))
                    {
                        _referencedUntrackedEntities.Value.Remove(keyValuePair.Key);

                        var newList = keyValuePair.Value.Where(tuple => tuple.Item2 != entry).ToList();

                        if (newList.Any())
                        {
                            _referencedUntrackedEntities.Value.Add(keyValuePair.Key, newList);
                        }
                    }
                }
            }
        }