private async Task <ActionResult> UpdateBuilders(string data)
        {
            if (string.IsNullOrEmpty(data))
            {
                return(Json(new MissingArgumentFailure()));
            }
            JObject builderData;

            try
            {
                builderData = JObject.Parse(data);
            }
            catch (Exception)
            {
                return(Json(new InvalidRequestFailure()));
            }
            var builders = new List <Builder>();

            foreach (var pair in builderData)
            {
                string builderName = pair.Key;
                string fraction;
                try
                {
                    fraction = pair.Value["LegionFraction"].Value <string>();
                }
                catch (Exception)
                {
                    fraction = "other";
                }
                Builder builder = await GetOrCreateBuilder(builderName);

                builder.Fraction = await GetOrCreateFraction(fraction);

                builder.UpdateValues(pair.Value);
                await _db.Database.ExecuteSqlCommandAsync($"DELETE FROM UnitAbilities WHERE UnitName = {builderName};");

                for (int i = 1; i <= 24; i++)
                {
                    string abilityName = pair.Value.GetValueOrDefault($"Ability{i}");
                    if (!string.IsNullOrEmpty(abilityName))
                    {
                        await GetOrCreateUnitAbility(builderName, abilityName, i);
                    }
                }
                builders.Add(builder);
            }
            _db.UpdateRange(builders.Select(u => u.Fraction).ToArray());
            _db.UpdateRange(builders);
            await _db.SaveChangesAsync();

            return(Json(new { Success = true }));
        }