internal IFacadeUpdateResult <SubjectData> SaveSubjectField(object subjectId, SubjectFieldInfoDto fieldInfoDto)
        {
            ArgumentValidator.IsNotNull("fieldInfoDto", fieldInfoDto);
            ArgumentValidator.IsNotNull("subjectId", subjectId);

            FacadeUpdateResult <SubjectData> result = new FacadeUpdateResult <SubjectData>();

            ISubjectService subjectService = UnitOfWork.GetService <ISubjectService>();
            var             subjectQuery   = subjectService.Retrieve(subjectId);

            if (!subjectQuery.HasResult)
            {
                AddError(result.ValidationResult, "SubjectCannotBeFound");
                return(result);
            }

            IDataTypeService dataTypeService = UnitOfWork.GetService <IDataTypeService>();
            int dataTypeId    = System.Convert.ToInt32(fieldInfoDto.FieldDataTypeId);
            var dataTypeQuery = dataTypeService.Retrieve(dataTypeId);

            if (!dataTypeQuery.HasResult)
            {
                AddError(result.ValidationResult, "DataTypeCannotBeFound");
                return(result);
            }

            Subject      subject      = subjectQuery.ToBo <Subject>();
            SubjectField subjectField = RetrieveOrNewSubjectField(subject, fieldInfoDto.SubjectFieldId);

            if (subjectField == null)
            {
                AddWarning(result.ValidationResult, "SubjectFieldCannotBeFound");
                return(result);
            }

            subjectField.FieldKey            = fieldInfoDto.FieldKey;
            subjectField.FieldLabel          = fieldInfoDto.FieldLabel;
            subjectField.HelpText            = fieldInfoDto.HelpText;
            subjectField.FieldDataType.Value = dataTypeQuery.ToBo <DataType>();
            subjectField.PickupEntityId      = fieldInfoDto.PickupEntityId;
            subjectField.LookupSubjectId     = fieldInfoDto.LookupSubjectId;
            subjectField.Sort         = fieldInfoDto.Sort;
            subjectField.RowIndex     = fieldInfoDto.RowIndex;
            subjectField.ColIndex     = fieldInfoDto.ColIndex;
            subjectField.IsRequired   = fieldInfoDto.IsRequired;
            subjectField.IsReadonly   = fieldInfoDto.IsReadonly;
            subjectField.IsLinkInGrid = fieldInfoDto.IsLinkInGrid;
            subjectField.IsShowInGrid = fieldInfoDto.IsShowInGrid;
            if (fieldInfoDto.MaxLength.HasValue)
            {
                subjectField.MaxLength = fieldInfoDto.MaxLength;
            }
            else
            {
                subjectField.MaxLength = fieldInfoDto.MaxLengthInTable;
            }
            subjectField.NavigateUrlFormatString = fieldInfoDto.NavigateUrlFormatString;

            var saveQuery = subjectService.Save(subject);

            result.Merge(saveQuery);
            result.AttachResult(subject.RetrieveData <SubjectData>());

            return(result);
        }