public void MovSubTree(String pk, String novaMae) { try { long tree = long.Parse(pk); long novaM = long.Parse(novaMae); T t = repo.Find(new object[] { tree }); byte[] hidAsByte = t.hid; SqlHierarchyId hid = Conversions.Bytes2HierarchyId(t.hid); byte[] novoHidAsByte = GetNextSonHid(novaMae); // novo hid da subtree SqlHierarchyId novoHid = Conversions.Bytes2HierarchyId(novoHidAsByte); t.hid = novoHidAsByte; // novo hid do nó da subtree db.Entry(t).State = EntityState.Modified; t = repo.Find(new object[] { novaM }); SqlHierarchyId novaMaehid = Conversions.Bytes2HierarchyId(t.hid); foreach (T r in repo.Get) // alterar os hids das descendentes { SqlHierarchyId h = Conversions.Bytes2HierarchyId(r.hid); if (h.IsDescendantOf(hid) && hidAsByte != r.hid) { r.hid = Conversions.HierarchyId2Bytes(h.GetReparentedValue(hid, novoHid)); db.Entry(r).State = EntityState.Modified; } } db.SaveChanges(); } catch (Exception ex) { throw new Exception("Erro ao mover nó: " + ex.Message); } }