コード例 #1
0
        /// <summary>
        /// 将源数据库中的数据记录移到另一个数据库
        /// </summary>
        /// <param name="SourceRootNodePath"></param>
        /// <param name="RootNodeType"></param>
        /// <param name="TargetRootNodePath"></param>
        public void MoveNodeBetweenDB(String SourceRootNodePath, String TargetRootNodePath)
        {
            //bool IsAddToTargetRoot = false;

            int slashIndex = SourceRootNodePath.LastIndexOf("/", SourceRootNodePath.Length - 2);
            //源节点文本,即在树中显示的文本
            String SourceRootNodeText = SourceRootNodePath.Substring(slashIndex + 1);
            //if (TargetRootNodePath == "/")
            //{
            //    IsAddToTargetRoot = true;
            //}
            //处理DetailText节点
            var sourceDetailNodes = from node in SourceDbContext.DetailTextDBs.AsNoTracking()
                                    where node.Path.StartsWith(SourceRootNodePath)
                                    select node;

            foreach (var detailNode in sourceDetailNodes)
            {
                //if (!IsAddToTargetRoot)
                //{
                //如果不是追加到根节点,则源节点路径去掉开头的“/”之后,拼接到目标路径之后
                detailNode.Path = TargetRootNodePath + detailNode.Path.Replace(SourceRootNodePath, SourceRootNodeText);
                //}
                //else {
                //    //如果是追加到根节点
                //    detailNode.Path ="/"+ detailNode.Path.Replace(SourceRootNodePath, SourceRootNodeText);
                //}


                TargetDbContext.DetailTextDBs.Add(detailNode);
            }

            //处理Folder节点,提取其相关联的所有文件
            var sourceFolderNodes = from node in SourceDbContext.FolderDBs.Include("DiskFiles").AsNoTracking()
                                    where node.Path.StartsWith(SourceRootNodePath)
                                    select node;

            foreach (var folderNode in sourceFolderNodes)
            {
                //if (!IsAddToTargetRoot)
                //{
                //源路径去掉开头的“/”之后,拼接到目标路径之后
                folderNode.Path = TargetRootNodePath + folderNode.Path.Replace(SourceRootNodePath, SourceRootNodeText);
                //}

                //else
                //{
                //    folderNode.Path = folderNode.Path.Replace(SourceRootNodePath, SourceRootNodeText);
                //}

                TargetDbContext.FolderDBs.Add(folderNode);
            }


            //提交更改

            TargetDbContext.SaveChanges();

            TargetDbContext.Dispose();

            //在源数据库中删除相关详细信息节点记录
            SourceDbContext.Database.ExecuteSqlCommand("Delete from DetailTextDB where Path like {0}", SourceRootNodePath + "%");
            //在源数据库中删除所有文件夹节点相关的记录,涉及三个表,为简单起见,使用EF完成。
            var query = from folder in SourceDbContext.FolderDBs
                        where folder.Path.StartsWith(SourceRootNodePath)
                        select folder;

            foreach (var folder in query)
            {
                List <DiskFile> files = folder.DiskFiles.ToList();

                foreach (var file in files)
                {
                    SourceDbContext.Entry(file).State = EntityState.Deleted;
                }

                SourceDbContext.FolderDBs.Remove(folder);
            }
            SourceDbContext.SaveChanges();
            SourceDbContext.Dispose();
        }