public static void AddEffects(this ModelBuilder builder, IEnumerable <Effect> effects, Func <Effect, BaseEffectBinding> createBinding)
        {
            foreach (Effect effect in effects)
            {
                BaseEffectBinding binding = createBinding.Invoke(effect);
                binding.Id = effect.Id;

                builder.AddEffect(effect, binding);
            }
        }
        public static void AddEffect(this ModelBuilder builder, Effect effect, BaseEffectBinding binding)
        {
            binding.EffectId = effect.Id;
            effect.BindingId = binding.Id;

            builder.AddData(binding.GetType(), binding);

            switch (effect)
            {
            case RestrictedAbilityBoostEffect boost:
                foreach (StatEffectBinding statBinding in boost.RequiredStats)
                {
                    statBinding.EffectId = effect.Id;
                    builder.AddData(statBinding);
                }
                boost.RequiredStats = Array.Empty <StatEffectBinding>();
                break;

            case ChoiceEffect choiceEffect:
                foreach (Effect choice in choiceEffect.Choices)
                {
                    builder.AddEffect(choice, new ChoiceEffectBinding {
                        Id = choice.Id, ChoiceId = choiceEffect.Id
                    });
                }

                choiceEffect.Choices = Array.Empty <Effect>();
                break;

            case CombinedEffect combinedEffect:
                foreach (Effect entry in combinedEffect.Entries)
                {
                    builder.AddEffect(entry, new CombinedEffectBinding {
                        Id = entry.Id, CombinedId = combinedEffect.Id
                    });
                }

                combinedEffect.Entries = Array.Empty <Effect>();
                break;
            }

            foreach (EffectPrerequisiteBinding prerequisiteEffectBinding in effect.Prerequisites)
            {
                Prerequisite prerequisite = prerequisiteEffectBinding.Prerequisite;
                prerequisiteEffectBinding.Prerequisite = null !;
                prerequisiteEffectBinding.EffectId     = effect.Id;

                builder.AddPrerequisite(prerequisite, prerequisiteEffectBinding);
            }
            effect.Prerequisites = Array.Empty <EffectPrerequisiteBinding>();

            foreach (EffectIncrement increment in effect.Increments)
            {
                increment.EffectId  = effect.Id;
                increment.TriggerId = increment.Trigger.Id;

                builder.AddData(increment.Trigger.GetType(), increment.Trigger);
                increment.Trigger = null !;

                builder.AddData(increment.GetType(), increment);
            }
            effect.Increments = Array.Empty <EffectIncrement>();

            builder.Entity(effect.GetType()).HasData(effect);
        }