public void RemoveItem(string modFileName, object id)
        {
            // Setup
            var gameItemKey = new GameItemKey(modFileName, id);

            if (!gameItemsByIdAndFile.ContainsKey(gameItemKey))
            {
                return;
            }

            var item = gameItemsByIdAndFile[gameItemKey];

            var tuples = recordItemRegistry[modFileName];
            var tuple  = (from t in tuples
                          where t.Item2 == item
                          select t).First();
            var record = tuple.Item1;

            var modFile = modFiles[modFileName];


            item.IdChanged -= OnIdChange;

            // Remove corresponding record from mod file.
            modFile.RemoveRecord(record);

            // Remove item from Record <-> TES3GameItem relationship.
            tuples.Remove(tuple);

            // Remove from versions caches.
            var versions = gameItemVersionsById[item.Id];
            GameItemVersion <TES3GameItem> version = null;

            for (var i = 0; i < versions.Count; ++i)
            {
                if (versions[i].ModFileName == modFileName)
                {
                    version = versions[i];
                    versions.RemoveAt(i);
                    break;
                }
            }
            gameItemVersionsByType[item.GetType()].Remove(version);

            // Remove from type registry.
            gameItemsByTypeAndFile[new TypeKey(modFileName, item.GetType())].Remove(item);

            // Remove direct key.
            gameItemsByIdAndFile.Remove(gameItemKey);
        }
        void HandleCommonCache(string modFileName, TES3GameItem item)
        {
            var key = new GameItemKey(modFileName, item.Id);

            if (gameItemsByIdAndFile.ContainsKey(key))
            {
                throw new InvalidOperationException($"Key already present for ModFile {modFileName}: {item.Id}({item.GetType()}); Current is {gameItemsByIdAndFile[key]}");
            }
            gameItemsByIdAndFile.Add(key, item);


            var version = new GameItemVersion <TES3GameItem>(modFileName, item);

            gameItemVersionsById[item.Id].Add(version);
            gameItemVersionsByType[item.GetType()].Add(version);
            gameItemsByTypeAndFile[new TypeKey(modFileName, item.GetType())].Add(item);

            gameItemOwnership.Add(item, modFileName);

            item.IdChanged += OnIdChange;
        }