/// <summary> /// 新增或更新 书籍与章节.. /// </summary> /// <param name="book"></param> /// <param name="replaceAll"></param> /// <returns></returns> public bool InsertOrUpdateBookAndChapter(Book book, bool replaceAll = true) { try { using (MyTranslateContext context = new MyTranslateContext()) { Book oldBook = context.Books.Find(book.BookCode); if (oldBook == null) { // 数据库中,数据不存在. // 新增逻辑. // 新增前处理. book.BeforeInsertOperation(); foreach (Chapter chapter in book.Chapters) { // 新增前处理. chapter.BeforeInsertOperation(); foreach (Line line in chapter.Lines) { // 新增前处理. line.BeforeInsertOperation(); } } context.Books.Add(book); } else { // 数据库中, 数据已存在, // 更新逻辑. // 书名. oldBook.BookName = book.BookName; // Url 地址. oldBook.BookUrl = book.BookUrl; // 有效性. oldBook.IsActive = book.IsActive; // 更新前处理. oldBook.BeforeUpdateOperation(); foreach (Chapter chapter in book.Chapters) { // 检查数据库中, 是否存在指定章节. Chapter dbChapter = context.Chapters.Include("Lines").FirstOrDefault(p => p.ChapterCode == chapter.ChapterCode); if (dbChapter != null && !replaceAll) { // 数据库中, 已存在章节。 // 但是本次操作, 是只更新。 // 那么 本章节则忽略. continue; } if (dbChapter == null) { // 数据库中, 章节不存在. // 新增逻辑. // 新增前处理. chapter.BeforeInsertOperation(); foreach (Line line in chapter.Lines) { // 新增前处理. line.BeforeInsertOperation(); } context.Chapters.Add(chapter); } else { // 数据库中,章节存在. // 更新逻辑. // 名称. dbChapter.ChapterName = chapter.ChapterName; dbChapter.ChapterTranslateName = chapter.ChapterTranslateName; dbChapter.BeforeUpdateOperation(); List <Line> newLineList = new List <Line>(); // 行. foreach (Line line in chapter.Lines) { Line dbLine = null; if (chapter.ChapterCode.Contains("NAMES")) { // 命名章节. // 按照 原始文本进行匹配. dbLine = dbChapter.Lines.FirstOrDefault(p => p.SourceText == line.SourceText); } else { // 普通章节. // 按照 行号匹配. dbLine = dbChapter.Lines.FirstOrDefault(p => p.LineNumber == line.LineNumber); } if (dbLine == null) { // 新增 newLineList.Add(line); } else { // 更新. dbLine.SourceText = line.SourceText; dbLine.MachineText = line.MachineText; dbLine.TranslateText = line.TranslateText; dbLine.Status = line.Status; dbLine.BeforeUpdateOperation(); } } if (newLineList.Count > 0) { foreach (Line newLine in newLineList) { // 新增的,需要重置 流水ID. newLine.LineID = 0; newLine.Chapter = null; newLine.CreateUser = null; newLine.BeforeInsertOperation(); dbChapter.Lines.Add(newLine); } } } } } // 物理保存. context.SaveChanges(); return(true); } } catch (Exception ex) { ResultMessage = ex.Message; return(false); } }