/// <summary>
        /// Transfers ownership of the given entity to the specified user.
        /// </summary>
        /// <param name="db">The database where the entities are stored.</param>
        /// <param name="newOwner">The new owner.</param>
        /// <param name="newOwnerEntities">The entities that the user already owns.</param>
        /// <param name="entity">The entity to transfer.</param>
        /// <typeparam name="TContext">The database context to use.</typeparam>
        /// <returns>An entity modification result, which may or may not have succeeded.</returns>
        public async Task <ModifyEntityResult> TransferEntityOwnershipAsync <TContext>
        (
            TContext db,
            User newOwner,
            IQueryable <IOwnedNamedEntity> newOwnerEntities,
            IOwnedNamedEntity entity
        )
            where TContext : DbContext
        {
            if (entity.IsOwner(newOwner))
            {
                return(ModifyEntityResult.FromError
                       (
                           $"That person already owns the {entity.EntityTypeDisplayName}."
                           .Humanize().Transform(To.SentenceCase)
                       ));
            }

            if (newOwnerEntities.Any(e => string.Equals(e.Name.ToLower(), entity.Name.ToLower())))
            {
                return(ModifyEntityResult.FromError
                       (
                           $"That user already owns a {entity.EntityTypeDisplayName} named {entity.Name}. Please rename it first."
                           .Humanize().Transform(To.SentenceCase)
                       ));
            }

            entity.Owner = newOwner;

            await db.SaveChangesAsync();

            return(ModifyEntityResult.FromSuccess());
        }
        /// <summary>
        /// Transfers ownership of the given entity to the specified user.
        /// </summary>
        /// <param name="newOwner">The new owner.</param>
        /// <param name="newOwnerEntities">The entities that the user already owns.</param>
        /// <param name="entity">The entity to transfer.</param>
        /// <returns>An entity modification result, which may or may not have succeeded.</returns>
        public ModifyEntityResult TransferEntityOwnership
        (
            User newOwner,
            IReadOnlyCollection <IOwnedNamedEntity> newOwnerEntities,
            IOwnedNamedEntity entity
        )
        {
            if (entity.IsOwner(newOwner))
            {
                return(ModifyEntityResult.FromError
                       (
                           $"That person already owns the {entity.EntityTypeDisplayName}."
                           .Humanize().Transform(To.SentenceCase)
                       ));
            }

            if (newOwnerEntities.Any(e => string.Equals(e.Name.ToLower(), entity.Name.ToLower())))
            {
                return(ModifyEntityResult.FromError
                       (
                           $"That user already owns a {entity.EntityTypeDisplayName} named {entity.Name}. Please rename it first."
                           .Humanize().Transform(To.SentenceCase)
                       ));
            }

            entity.Owner = newOwner;

            return(ModifyEntityResult.FromSuccess());
        }
    /// <summary>
    /// Transfers ownership of the given entity to the specified user.
    /// </summary>
    /// <param name="newOwnerID">The ID of the new owner.</param>
    /// <param name="newOwnerEntities">The entities that the user already owns.</param>
    /// <param name="entity">The entity to transfer.</param>
    /// <returns>An entity modification result, which may or may not have succeeded.</returns>
    public async Task <Result> TransferEntityOwnershipAsync
    (
        Snowflake newOwnerID,
        IEnumerable <IOwnedNamedEntity> newOwnerEntities,
        IOwnedNamedEntity entity
    )
    {
        var getNewOwner = await _users.GetOrRegisterUserAsync(newOwnerID);

        if (!getNewOwner.IsSuccess)
        {
            return(Result.FromError(getNewOwner));
        }

        var newOwner = getNewOwner.Entity;

        if (entity.IsOwner(newOwner))
        {
            return(new UserError
                   (
                       $"That person already owns the {entity.EntityTypeDisplayName}."
                       .Humanize().Transform(To.SentenceCase)
                   ));
        }

        if (newOwnerEntities.Any(e => string.Equals(e.Name.ToLower(), entity.Name.ToLower())))
        {
            return(new UserError
                   (
                       $"That user already owns a {entity.EntityTypeDisplayName} named {entity.Name}. Please rename it first."
                       .Humanize().Transform(To.SentenceCase)
                   ));
        }

        entity.Owner = newOwner;

        return(Result.FromSuccess());
    }
        /// <summary>
        /// Transfers ownership of the given entity to the specified user.
        /// </summary>
        /// <param name="db">The database where the entities are stored.</param>
        /// <param name="newOwner">The new owner.</param>
        /// <param name="newOwnerEntities">The entities that the user already owns.</param>
        /// <param name="entity">The entity to transfer.</param>
        /// <returns>An entity modification result, which may or may not have succeeded.</returns>
        public async Task <ModifyEntityResult> TransferEntityOwnershipAsync
        (
            [NotNull] GlobalInfoContext db,
            [NotNull] IUser newOwner,
            [NotNull] IQueryable <IOwnedNamedEntity> newOwnerEntities,
            [NotNull] IOwnedNamedEntity entity
        )
        {
            if (entity.IsOwner(newOwner))
            {
                return(ModifyEntityResult.FromError
                       (
                           CommandError.Unsuccessful,
                           $"That person already owns the {entity.EntityTypeDisplayName}."
                           .Humanize().Transform(To.SentenceCase)
                       ));
            }

            if (newOwnerEntities.Any(e => string.Equals(e.Name, entity.Name, StringComparison.OrdinalIgnoreCase)))
            {
                return(ModifyEntityResult.FromError
                       (
                           CommandError.MultipleMatches,
                           $"That user already owns a {entity.EntityTypeDisplayName} named {entity.Name}. Please rename it first."
                           .Humanize().Transform(To.SentenceCase)
                       ));
            }

            var newUser = await db.GetOrRegisterUserAsync(newOwner);

            entity.Owner = newUser;

            await db.SaveChangesAsync();

            return(ModifyEntityResult.FromSuccess(ModifyEntityAction.Edited));
        }