Beispiel #1
0
        /// <summary>
        /// SysStore及SqlStore通用
        /// </summary>
        private static async Task RemoveIndex(DesignHub hub, string appName, EntityModel entityModel, byte indexId)
        {
            if (entityModel.StoreOptions == null)
            {
                throw new InvalidOperationException("Can't remove index for DTO");
            }
            if (!entityModel.StoreOptions.HasIndexes)
            {
                throw new Exception($"EntityModel[{entityModel.Name}] not has any indexes.");
            }

            var index = entityModel.StoreOptions.Indexes.SingleOrDefault(t => t.IndexId == indexId);

            if (index == null)
            {
                throw new Exception($"EntityModel[{entityModel.Name}] has no index: {indexId}");
            }

            if (entityModel.SysStoreOptions != null)
            {
                //查询服务代码引用项
                var refs = await RefactoringService.FindUsagesAsync(hub,
                                                                    ModelReferenceType.EntityIndexName, appName, entityModel.Name, index.Name);

                if (refs != null && refs.Count > 0)
                {
                    throw new Exception($"EntityIndex[{entityModel.Name}.{index.Name}] has references.");
                }
            }

            index.MarkDeleted();
        }
Beispiel #2
0
        public async Task <object> Handle(DesignHub hub, InvokeArgs args)
        {
            var refType       = (ModelReferenceType)args.GetInt32();
            var modelIDString = args.GetString();
            var memberName    = args.GetString();
            var modelId       = ulong.Parse(modelIDString);

            ModelType modelType = IdUtil.GetModelTypeFromModelId(modelId);
            var       modelNode = hub.DesignTree.FindModelNode(modelType, modelId);

            if (modelNode == null)
            {
                throw new Exception("Can't find model");
            }

            return(await RefactoringService.FindUsagesAsync(hub, refType,
                                                            modelNode.AppNode.Model.Name, modelNode.Model.Name, memberName));
        }
Beispiel #3
0
        public async Task <object> Handle(DesignHub hub, InvokeArgs args)
        {
            // 获取接收到的参数
            string modelId  = args.GetString();
            string itemName = args.GetString();

            var modelNode = hub.DesignTree.FindModelNode(ModelType.Enum, ulong.Parse(modelId));

            if (modelNode == null)
            {
                throw new Exception("Can't find Enum node");
            }
            var model = (EnumModel)modelNode.Model;

            //查找成员引用
            var refs = await RefactoringService.FindUsagesAsync(hub,
                                                                ModelReferenceType.EnumModelItemName, modelNode.AppNode.Model.Name, model.Name, itemName);

            if (refs != null && refs.Count > 0) //有引用项不做删除操作
            {
                return(refs);                   //TODO:直接报错,不返回引用项
            }
            var item = model.Items.FirstOrDefault(t => t.Name == itemName);

            if (item != null)
            {
                model.Items.Remove(item);
            }
            // 保存到本地
            await modelNode.SaveAsync(null);

            // 更新RoslynDocument
            await hub.TypeSystem.UpdateModelDocumentAsync(modelNode);

            return(null);
        }
        public async Task <object> Handle(DesignHub hub, InvokeArgs args)
        {
            // 获取接收到的参数
            string modelId    = args.GetString();
            string memberName = args.GetString();

            var node = hub.DesignTree.FindNode(DesignNodeType.EntityModelNode, modelId);

            if (node == null)
            {
                throw new Exception("Can't find entity model node");
            }
            var modelNode = node as ModelNode;
            var model     = modelNode.Model as EntityModel;

            if (!modelNode.IsCheckoutByMe)
            {
                throw new Exception("Node has not checkout");
            }
            var mm = model.GetMember(memberName, true);

            //判断是否外键及被索引使用,仅DataField
            if (mm.Type == EntityMemberType.DataField)
            {
                var dfm = (DataFieldModel)mm;
                if (dfm.IsForeignKey)
                {
                    throw new Exception("Can't delete a foregn key member");
                }

                if (model.StoreOptions != null && model.StoreOptions.HasIndexes)
                {
                    foreach (var index in model.StoreOptions.Indexes)
                    {
                        //排除已标为删除的
                        if (index.PersistentState != PersistentState.Deleted)
                        {
                            if (index.Fields.Any(t => t.MemberId == mm.MemberId))
                            {
                                throw new Exception($"Member are used in Index[{index.Name}]");
                            }
                            if (index.HasStoringFields)
                            {
                                if (index.StoringFields.Any(t => t == mm.MemberId))
                                {
                                    throw new Exception($"Member are used in Index[{index.Name}]");
                                }
                            }
                        }
                    }
                }
            }

            //查找成员引用
            var refs = await RefactoringService.FindUsagesAsync(hub,
                                                                ModelReferenceType.EntityMemberName, modelNode.AppNode.Model.Name, model.Name, memberName);

            if (refs != null && refs.Count > 0) //有引用项不做删除操作
            {
                return(refs);                   //TODO:直接报错,不返回引用项
            }
            model.RemoveMember(memberName);

            // 保存到本地
            await modelNode.SaveAsync(null);

            // 更新RoslynDocument
            await hub.TypeSystem.UpdateModelDocumentAsync(modelNode);

            return(null);
        }