/// <summary>
        /// Executes an action on default culture text if it does not exist. Actions include - nothing, create empty string, copy current culture text
        /// </summary>
        /// <param name="actionForDefaultCulture">Specific action</param>
        /// <param name="dynamicText">Current dynamic text entity</param>
        /// <param name="currentCulture">Current culture entity</param>
        /// <param name="dictionaryScope">Current dictionary scope entity</param>
        /// <param name="dbContext">Database context</param>
        /// <param name="dao">DAO of static text entity</param>
        private void ExecuteDefaultCultureAction(IfDefaultNotExistAction actionForDefaultCulture,
                                                 DynamicText dynamicText, Culture currentCulture,
                                                 DictionaryScope dictionaryScope, IDatabaseStaticTextContext dbContext, StaticTextDao dao)
        {
            var defaultCulture = GetDefaultCulture(dbContext);

            if (currentCulture == defaultCulture)
            {
                return;
            }

            var defaultText = dao.FindByNameAndCultureAndScope(
                dynamicText.Name, defaultCulture, dictionaryScope, dbContext.CultureHierarchy
                );

            if (defaultText != null)
            {
                return;
            }

            defaultText = new StaticText
            {
                Format           = dynamicText.Format,
                ModificationTime = DateTime.UtcNow,
                ModificationUser = dynamicText.ModificationUser,
                Name             = dynamicText.Name,
                Culture          = defaultCulture,
                DictionaryScope  = dictionaryScope,
            };

            switch (actionForDefaultCulture)
            {
            case IfDefaultNotExistAction.DoNothing:
                return;

            case IfDefaultNotExistAction.CreateEmpty:
                defaultText.Text = string.Empty;
                dao.Create(defaultText);
                break;

            case IfDefaultNotExistAction.CreateTextCopy:
                defaultText.Text = dynamicText.Text;
                dao.Create(defaultText);
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(actionForDefaultCulture), actionForDefaultCulture,
                                                      "Invalid default language save action");
            }
        }
        public DynamicText SaveDynamicText(DynamicText dynamicText,
                                           IfDefaultNotExistAction actionForDefaultCulture = IfDefaultNotExistAction.DoNothing)
        {
            using (var dbContext = m_dbContextFunc.Invoke())
            {
                var dao             = new StaticTextDao(dbContext.StaticText);
                var dictionaryScope = GetDictionaryScope(dbContext, dynamicText.DictionaryScope);
                if (dictionaryScope.Name != dynamicText.DictionaryScope)
                {
                    dictionaryScope = CreateDictionaryScope(dbContext, dynamicText.DictionaryScope);
                }

                var culture         = GetCultureByNameOrGetDefault(dbContext, dynamicText.Culture);
                var existsInCulture = culture.Name == dynamicText.Culture;

                if (!existsInCulture)
                {
                    culture = CreateCulture(dbContext, dynamicText.Culture);
                    CreateCultureHierarchy(dbContext, culture);
                }

                var staticText = dao.FindByNameAndCultureAndScope(
                    dynamicText.Name, culture, dictionaryScope, dbContext.CultureHierarchy
                    );
                if (staticText == null || !existsInCulture || staticText.CultureId != culture.Id)
                {
                    staticText = new StaticText
                    {
                        Format           = dynamicText.Format,
                        ModificationTime = DateTime.UtcNow,
                        ModificationUser = dynamicText.ModificationUser,
                        Name             = dynamicText.Name,
                        Text             = dynamicText.Text,
                        Culture          = culture,
                        DictionaryScope  = dictionaryScope
                    };

                    dao.Create(staticText);
                }
                else
                {
                    staticText.Format           = dynamicText.Format;
                    staticText.ModificationTime = DateTime.UtcNow;
                    staticText.ModificationUser = dynamicText.ModificationUser;
                    staticText.Name             = dynamicText.Name;
                    staticText.Text             = dynamicText.Text;

                    dao.Update(staticText);
                }

                ExecuteDefaultCultureAction(actionForDefaultCulture, dynamicText, culture, dictionaryScope, dbContext,
                                            dao);

                dbContext.SaveChanges();

                return(dynamicText);
            }
        }