예제 #1
0
        public void pasteNode(int idPasteParentElem, int idCopyParentElem)
        {
            nodePaste = idPasteParentElem;
            int nodeCopy = idCopyParentElem;
            int maxID1;

            //var OPCName = nameOPC;
            using (var context = new EFDbContext())
            {
                var rootCopy2 = context.Objects.Where(c => c.Id == nodeCopy).Select(c => c).FirstOrDefault();


                //узел, в который будет произведена вставка
                var nodePasteName = from o1 in context.Objects
                                    where o1.Id == nodePaste
                                    select o1.Name;
                //Извлечем копируемый корневой узел с его свойствами
                var rootCopy = from o1 in context.Objects
                               join o2 in context.Properties on o1.Id equals o2.ObjectId
                               where o1.Id == nodeCopy && o2.PropId == 0
                               select new
                {
                    id        = o1.Id,
                    name      = o1.Name,
                    parentID  = o1.ParentId,
                    type      = o1.Type,
                    propValue = o2.Value
                };
                //Преобразуем в список, чтобы не использвать foreach. В дальнейшем избавиться от листа
                var rootCopyNode = rootCopy.ToList();      //корневой для копировани
                var pasteNode    = nodePasteName.ToList(); //узел для вставки
                //подготовим корневую сущность для вставки в таблицу Objects
                Objects obj = new Objects
                {
                    //id = maxID1++,
                    ParentId = idPasteParentElem,
                    Type     = rootCopyNode[0].type,
                    Name     = rootCopyNode[0].name
                };
                context.Objects.Add(obj);
                context.SaveChanges();

                string newPropJson;
                //найдем ID только что вставленного корневого элемента
                maxID1 = context.Objects.Select(c => c.Id).Max();
                if (rootCopy2.Type == 21)
                {
                    newPropJson = "";
                }
                else
                {
                    //распилим свойства корневого вставляемого элемента
                    var getNewPropArr = rootCopyNode[0].propValue.Split(',');

                    var oldID = getNewPropArr[0];
                    var newID = "{\"Id\":\"" + maxID1 + "\"";
                    //Заменим ID на актуальный в свойствах
                    newPropJson = rootCopyNode[0].propValue.Replace(oldID, newID);
                    if (rootCopy2.Type == 2)
                    {
                        string newConnSrt    = getConnectionProp(idPasteParentElem) + rootCopy2.Name;
                        var    oldConnection = getNewPropArr[3];
                        var    newConnection = "\"Connection\":\"" + newConnSrt + "\"";
                        var    oldOPCID      = getNewPropArr[2];
                        var    newOPCID      = "\"Opc\":\"" + OPCID + "\"";
                        newPropJson = newPropJson.Replace(oldOPCID, newOPCID);
                        newPropJson = newPropJson.Replace(oldConnection, newConnection);
                    }
                }

                Property objProp = new Property
                {
                    ObjectId = maxID1,
                    PropId   = 0,
                    Value    = newPropJson
                };
                context.Properties.Add(objProp);
                context.SaveChanges();
            }
            pasteJsTreeNodes(nodeCopy, maxID1);
        }
예제 #2
0
        public void pasteJsTreeNodes(int parID, int parIDCopy)
        {
            using (var context = new EFDbContext())
            {
                //Достанем самый верхний копируемый узел
                var root = context.Objects.Where(c => c.Id == parID).Select(c => c).FirstOrDefault();

                //var childs1 = context.Objects.Where(c => c.ParentId == parID).Select(c => c);
                //Извлечем все дочерние узлы
                var childs = from o1 in context.Objects
                             join o2 in context.Properties on o1.Id equals o2.ObjectId
                             where o1.ParentId == parID && o2.PropId == 0
                             select new
                {
                    id        = o1.Id,
                    name      = o1.Name,
                    parentID  = o1.ParentId,
                    type      = o1.Type,
                    propValue = o2.Value
                };

                int counter = 0;

                foreach (var child in childs)
                {
                    //сохранить в базу строку с ID нового узла и его родительским узлом
                    //а еще скопировать свойства из Properties, но учесть, что в JSON свойствах есть ID старого элемента и его надо менять
                    //сделать запрос на макс используемый ID в базе

                    using (var context1 = new EFDbContext())
                    {
                        //проверка чтобы избежать бесконечной вставки набора копируемых узлов.
                        // то есть
                        if (child.parentID == nodePaste)
                        {
                            return;
                        }
                        //Добавление записи в табл Object
                        Objects obj1 = new Objects
                        {
                            ParentId = parIDCopy,
                            Type     = child.type,
                            Name     = child.name
                        };
                        context1.Objects.Add(obj1);
                        context1.SaveChanges();

                        //ID только что вставленного элемента
                        using (var context2 = new EFDbContext())
                        {
                            maxIdForProp = context2.Objects.Select(c => c.Id).Max();
                        }
                        string newPropJson = "";
                        //если тип узла- папка, то редактировать json свойство не нужно и посылаем пустую строку
                        if (child.type == 13)
                        {
                            newPropJson = "";
                        }
                        else
                        {
                            //поправим значение ID в строке свойств
                            var getNewIDArr = child.propValue.Split(',');
                            var oldID       = getNewIDArr[0];
                            var newID       = "{\"Id\":\"" + maxIdForProp + "\"";
                            newPropJson = child.propValue.Replace(oldID, newID);

                            if (child.type == 2)
                            {
                                string newConnSrt    = getConnectionProp(parIDCopy) + child.name;
                                var    oldConnection = getNewIDArr[3];
                                var    newConnection = "\"Connection\":\"" + newConnSrt + "\"";
                                newPropJson = newPropJson.Replace(oldConnection, newConnection);
                                var oldOPCID = getNewIDArr[2];
                                var newOPCID = "\"Opc\":\"" + OPCID + "\"";
                                newPropJson = newPropJson.Replace(oldOPCID, newOPCID);
                            }
                        }

                        //вставка строки со свойствами в таблицу свойств
                        Property objProp = new Property
                        {
                            ObjectId = maxIdForProp,
                            PropId   = 0,
                            Value    = newPropJson
                        };
                        context1.Properties.Add(objProp);
                        context1.SaveChanges();
                        //Сделала новый Using, потому что возникала ошибка. Не знаю верное ли решение
                        //{System.Data.Entity.Core.EntityException: An error occurred while starting a transaction on the provider connection. See the inner exception for details. --->
                        //System.InvalidOperationException:
                        //Существует назначенный этой команде Command открытый DataReader, который требуется предварительно закрыть.
                        //using (var db2 = new EFDbContext())
                        //{
                        //    maxID = db2.Objects.Select(c => c.Id).Max();
                        //    maxID2 =maxID;
                        //}
                    }
                    pasteJsTreeNodes(child.id, maxIdForProp);
                    counter++;
                }
            }
        }
예제 #3
0
 public JSTree()
 {
     this.context = new EFDbContext();
 }