示例#1
0
        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); }
        }