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); }
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++; } } }
public JSTree() { this.context = new EFDbContext(); }