/// <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(); }