Example #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);



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

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

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

                TargetDbContext.InfoNodeDBs.Add(InfoNodeNode);
            }


            //提交更改

            TargetDbContext.SaveChanges();

            TargetDbContext.Dispose();

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

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

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

                SourceDbContext.InfoNodeDBs.Remove(InfoNode);
            }
            SourceDbContext.SaveChanges();
            SourceDbContext.Dispose();
        }