private void HandleCreateApp(object param) { List <object> addedList = new List <object>(); try { // int childrenCnt = (from i in DbContext.ProjectParts where i.ParentPart == Part.Id select i).Count(); if (childrenCnt > 0) { throw new Exception("只能在没有子结点的部位创建测点"); } int appCnt = (from s in DbContext.Apps where s.AppName == NewApp.AppName || s.CalculateName == NewApp.CalculateName select s).Count(); if (appCnt > 0) { throw new Exception("新测点的名称或计算名称已存在,无法创建"); } App needAddApp = new App(); needAddApp.Id = Guid.NewGuid(); needAddApp.ProjectPartID = Part.Id; needAddApp.AppName = NewApp.AppName; needAddApp.CalculateName = NewApp.CalculateName; needAddApp.BuriedTime = NewApp.BuriedTime; needAddApp.X = NewApp.X; needAddApp.Y = NewApp.Y; needAddApp.Z = NewApp.Z; needAddApp.OtherInfo = NewApp.OtherInfo; DbContext.AddToApps(needAddApp); addedList.Add(needAddApp); DbContext.SaveChanges(); _currentApps.Add(needAddApp); if (AllowClone) { //clone app params if (CloneAppName.Trim().Length == 0) { throw new Exception("当选择克隆时,模板测点不能为空"); } if (cloneApp == null) { cloneApp = (from s in DbContext.Apps where s.AppName == CloneAppName select s).FirstOrDefault(); if (cloneApp == null) { throw new Exception(string.Format("找不到测点编号为{0}的测点", CloneAppName)); } } DbContext.LoadProperty(cloneApp, "AppParams"); var paramsList = new List <AppParam>(); var formulaList = new List <Formula>(); foreach (var item in cloneApp.AppParams) { AppParam newParam = null; if (item is ConstantParam) { newParam = new ConstantParam(); (newParam as ConstantParam).Val = (item as ConstantParam).Val; } else if (item is MessureParam) { newParam = new MessureParam(); } else if (item is CalculateParam) { newParam = new CalculateParam(); } //set values newParam.Id = Guid.NewGuid(); newParam.AppId = needAddApp.Id; newParam.ParamName = item.ParamName; newParam.ParamSymbol = item.ParamSymbol; newParam.PrecisionNum = item.PrecisionNum; newParam.UnitSymbol = item.UnitSymbol; newParam.Order = item.Order; newParam.Description = item.Description; paramsList.Add(newParam); //DbContext.AddToAppParams(newParam); //addedList.Add(newParam); //clone formules if (item is CalculateParam) { CalculateParam cp = item as CalculateParam; var formulae = (from i in DbContext.Formulae where i.ParamId == cp.Id select i).ToList(); foreach (var fl in formulae) { Formula newfl = new Formula(); newfl.Id = Guid.NewGuid(); newfl.ParamId = newParam.Id; newfl.FormulaExpression = fl.FormulaExpression; newfl.StartDate = fl.StartDate; newfl.EndDate = fl.EndDate; newfl.CalculateOrder = fl.CalculateOrder; formulaList.Add(newfl); //DbContext.AddToFormulae(newfl); //addedList.Add(newfl); } } } ParamsDTO dto = new ParamsDTO(); dto.AddedParams = paramsList; dto.AddedFormulae = formulaList; DbContext.UpdateAppParams(dto); } var msg = new DialogMessage("测点创建成功并已添加到相关的工程部位中。", result => { }); msg.Caption = "创建成功"; msg.Button = MessageBoxButton.OK; msg.Icon = MessageBoxImage.Information; Messenger.Default.Send <DialogMessage>(msg); } catch (Exception ex) { Messenger.Default.Send <Exception>(ex); //reject the changes foreach (object item in addedList) { DbContext.Detach(item); } } finally { // DbContext.Detach(NewApp); } }