public void AllFieldMetadataOfIndividualObjectMetadataTest()
        {
            IMetadataApi metadataApi = SpringContext.Current.GetObject<IMetadataApi>();
            Guid userTypeId = metadataApi.AddType("User", "Membership", "User Extension Description", ObjectMetadataTypes.Custom, false, null);
            metadataApi.SaveField(userTypeId, new StringFieldMetadata() { Name = "Name", IsRequired = true, MaxLengthSpecified = true, MaxLength = 32, Ordinal = 1 });
            metadataApi.SaveField(userTypeId, new DateTimeFieldMetadata() { Name = "Birthday", DefaultValue = new DateTimeValue { DateTimeValueType = DateTimeValueTypes.Now }, Ordinal = 2 });
            metadataApi.SaveField(userTypeId, new IntegerFieldMetadata() { Name = "Level", IsRequired = true, DefaultSpecified = true, Default = 10, Ordinal = 3 });
            metadataApi.SaveField(userTypeId, new DecimalFieldMetadata() { Name = "Salary", IsRequired = true, MinValueSpecified = true, MinValue = 800m, DefaultSpecified = true, Default = 2500m, Ordinal = 4 });

            HierarchyNode hierarchyNodeQA = new HierarchyNode { Name = "QA", Value = "QA" };
            HierarchyNode hierarchyNodeDev = new HierarchyNode { Name = "Dev", Value = "Dev" };
            HierarchyNode hierarchyNodeLeader = new HierarchyNode { Name = "Leader", Value = "Leader", Node = new HierarchyNode[] { hierarchyNodeQA, hierarchyNodeDev } };
            HierarchyNode hierarchyNodeManager = new HierarchyNode { Name = "Manager", Value = "Manager", Node = new HierarchyNode[] { hierarchyNodeLeader } };
            HierarchyNode hierarchyNodeDirector = new HierarchyNode { Name = "Director", Value = "Director", Node = new HierarchyNode[] { hierarchyNodeManager } };
            HierarchyFieldMetadata hierarchyFieldMetadata = new HierarchyFieldMetadata { Name = "Position", Description = "Position in hierarchy", IsRequired = true, Ordinal = 5, SelectionMode = SelectionModes.Single, Node = new HierarchyNode[] { hierarchyNodeDirector } };
            metadataApi.SaveField(userTypeId, hierarchyFieldMetadata);

            SelectionItem selectionItemShangHai = new SelectionItem { Name = "ShangHai", Value = "ShangHai" };
            SelectionItem selectionItemJiangSu = new SelectionItem { Name = "JiangSu", Value = "JiangSu" };
            SelectionItem selectionItemSiChuan = new SelectionItem { Name = "SiChuan", Value = "SiChuan" };
            SelectionItem selectionItemBlank = new SelectionItem { Name = "", Value = "" };
            EnumerationFieldMetadata enumerationFieldMetadata = new EnumerationFieldMetadata { Name = "HuKou", Ordinal = 6, SelectionMode = SelectionModes.Single, Items = new SelectionItem[] { selectionItemBlank, selectionItemJiangSu, selectionItemShangHai, selectionItemSiChuan } };
            metadataApi.SaveField(userTypeId, enumerationFieldMetadata);

            // 测试获取各个属性
            AssertFieldMetadata(metadataApi, userTypeId);

            // 测试删除一个属性
            metadataApi.DeleteField(userTypeId, "HuKou");
            Assert.AreEqual(5, metadataApi.GetFields(userTypeId).Count());

            // 测试更新一个属性的默认值
            IntegerFieldMetadata fieldMetadataLevel = metadataApi.GetField(userTypeId, "Level") as IntegerFieldMetadata;
            fieldMetadataLevel.Default = 9;
            metadataApi.SaveField(userTypeId, fieldMetadataLevel);
            fieldMetadataLevel = metadataApi.GetField(userTypeId, "Level") as IntegerFieldMetadata;
            Assert.AreEqual(9, fieldMetadataLevel.Default);

            // 删除扩展类型,会自动删除其所有的属性定义
            metadataApi.DeleteType(userTypeId);
            Assert.AreEqual(0, metadataApi.GetFields(userTypeId).Count());
        }
        private static void GetSelectedHierarchyNodes(HierarchyNodeValueCollection selectedHierarchyNodes, HierarchyNode[] hierarchyNodes)
        {
            if (hierarchyNodes == null) return;

            foreach (HierarchyNode hierarchyNode in hierarchyNodes)
            {
                if (hierarchyNode.Selected)
                    selectedHierarchyNodes.Add(hierarchyNode.Value);

                GetSelectedHierarchyNodes(selectedHierarchyNodes, hierarchyNode.Node);
            }
        }
        private static List<string> GetAllDefinedHierarchyNodeValues(HierarchyNode[] hierarchyNodes)
        {
            if (hierarchyNodes == null || hierarchyNodes.Length == 0)
                return new List<string>();

            List<string> hierarchyNodeValues = hierarchyNodes.Select(h => h.Value).ToList();
            foreach (HierarchyNode hierarchyNode in hierarchyNodes)
                hierarchyNodeValues.AddRange(GetAllDefinedHierarchyNodeValues(hierarchyNode.Node));

            return hierarchyNodeValues;
        }
        public void HierarchyFieldMetadataValidationTest()
        {
            HierarchyNode hierarchyNodeChengDu = new HierarchyNode { Name = "ChengDu", Value = "ChengDu" };
            HierarchyNode hierarchyNodeShangHai = new HierarchyNode { Name = "ShangHai", Value = "ShangHai" };
            HierarchyNode hierarchyNodeChina = new HierarchyNode { Name = "China", Value = "China", Node = new HierarchyNode[] { hierarchyNodeChengDu, hierarchyNodeShangHai } };
            HierarchyNode hierarchyNodeAsia = new HierarchyNode { Name = "Asia", Value = "Asia", Node = new HierarchyNode[] { hierarchyNodeChina } };
            HierarchyNode hierarchyNodeEarth = new HierarchyNode { Name = "Earth", Value = "Earth", Node = new HierarchyNode[] { hierarchyNodeAsia } };
            HierarchyFieldMetadata fieldMetadata = new HierarchyFieldMetadata
            {
                Name = "Geoghraph",
                SelectionMode = SelectionModes.Single,
                Node = new HierarchyNode[] { hierarchyNodeEarth }
            };

            // 空值合法
            fieldMetadata.Validate(null);

            // 合法值
            fieldMetadata.Validate(new HierarchyNodeValueCollection { "ChengDu" }.FieldValue());

            try
            {
                fieldMetadata.Validate(new HierarchyNodeValueCollection { "HangZhou" }.FieldValue());
                Assert.Fail("HangZhou没有在Hierarchy中定义");
            }
            catch (InvalidFieldValueException) { }

            try
            {
                fieldMetadata.Validate(new HierarchyNodeValueCollection { "ChengDu", "ShangHai" }.FieldValue());
                Assert.Fail("当前Hierarchy只能设定单值");
            }
            catch (InvalidFieldValueException) { }
        }