private static Func <ISession <PrivateAuthentication>, ITest, Task <IReadOnlyDictionary <object, FieldPropertyCollection> > > BeforeTest(Func <CreateFieldsRequest> createRequestFunction, IEnumerable <FieldProperty> select) { return(async(session, test) => { var result = await CreateFields(createRequestFunction, select)(session, test); await DeleteFields(session, test, result); return result; }); }
/// <summary> /// 编辑 /// 1、明细表必须把主表的主键字段也设置为可编辑 /// 2、修改、增加只会操作设置为编辑列的数据 /// </summary> /// <param name="saveModel"></param> /// <returns></returns> public virtual WebResponseContent Update(SaveModel saveModel) { if (UpdateOnExecute != null) { Response = UpdateOnExecute(saveModel); if (!Response.Status) { return(Response); } } if (saveModel == null) { return(Response.Error(ResponseType.ParametersLack)); } Type type = typeof(T); //设置修改时间,修改人的默认值 UserInfo userInfo = UserContext.Current.UserInfo; saveModel.SetDefaultVal(AppSetting.ModifyMember, userInfo); //判断提交的数据与实体格式是否一致 string result = type.ValidateDicInEntity(saveModel.MainData, true, false, UserIgnoreFields); if (result != string.Empty) { return(Response.Error(result)); } PropertyInfo mainKeyProperty = type.GetKeyProperty(); //验证明细 Type detailType = null; if (saveModel.DetailData != null || saveModel.DelKeys != null) { saveModel.DetailData = saveModel.DetailData == null ? new List <Dictionary <string, object> >() : saveModel.DetailData.Where(x => x.Count > 0).ToList(); detailType = typeof(T).GetCustomAttribute <EntityAttribute>().DetailTable[0]; result = detailType.ValidateDicInEntity(saveModel.DetailData, true, false, new string[] { mainKeyProperty.Name }); if (result != string.Empty) { return(Response.Error(result)); } } //获取主建类型的默认值用于判断后面数据是否正确,int long默认值为0,guid :0000-000.... object keyDefaultVal = mainKeyProperty.PropertyType.Assembly.CreateInstance(mainKeyProperty.PropertyType.FullName);//.ToString(); //判断是否包含主键 if (mainKeyProperty == null || !saveModel.MainData.ContainsKey(mainKeyProperty.Name) || saveModel.MainData[mainKeyProperty.Name] == null ) { return(Response.Error(ResponseType.NoKey)); } object mainKeyVal = saveModel.MainData[mainKeyProperty.Name]; //判断主键类型是否正确 (bool, string, object)validation = mainKeyProperty.ValidationValueForDbType(mainKeyVal).FirstOrDefault(); if (!validation.Item1) { return(Response.Error(ResponseType.KeyError)); } object valueType = mainKeyVal.ToString().ChangeType(mainKeyProperty.PropertyType); //判断主键值是不是当前类型的默认值 if (valueType == null || (!valueType.GetType().Equals(mainKeyProperty.PropertyType) || valueType.ToString() == keyDefaultVal.ToString() )) { return(Response.Error(ResponseType.KeyError)); } if (saveModel.MainData.Count <= 1) { return(Response.Error("系统没有配置好编辑的数据,请检查model!")); } Expression <Func <T, bool> > expression = mainKeyProperty.Name.CreateExpression <T>(mainKeyVal.ToString(), LinqExpressionType.Equal); if (!repository.Exists(expression)) { return(Response.Error("保存的数据不存在!")); } //没有明细的直接保存主表数据 if (detailType == null) { saveModel.SetDefaultVal(AppSetting.ModifyMember, userInfo); T mainEntity = saveModel.MainData.DicToEntity <T>(); if (UpdateOnExecuting != null) { Response = UpdateOnExecuting(mainEntity, null, null, null); if (!Response.Status) { return(Response); } } //不修改!CreateFields.Contains创建人信息 repository.Update(mainEntity, type.GetEditField().Where(c => saveModel.MainData.Keys.Contains(c) && !CreateFields.Contains(c)).ToArray()); if (base.UpdateOnExecuted == null) { repository.SaveChanges(); Response.OK(ResponseType.SaveSuccess); } else { Response = repository.DbContextBeginTransaction(() => { repository.SaveChanges(); Response = UpdateOnExecuted(mainEntity, null, null, null); return(Response); }); } if (Response.Status) { Response.Data = new { data = mainEntity } } ; if (Response.Status && string.IsNullOrEmpty(Response.Message)) { Response.OK(ResponseType.SaveSuccess); } return(Response); } saveModel.DetailData = saveModel.DetailData.Where(x => x.Count > 0).ToList(); //明细操作 PropertyInfo detailKeyInfo = detailType.GetKeyProperty(); //主键类型 // string detailKeyType = mainKeyProperty.GetTypeCustomValue<ColumnAttribute>(c => new { c.TypeName }); //判断明细是否包含了主表的主键 string deatilDefaultVal = detailKeyInfo.PropertyType.Assembly.CreateInstance(detailKeyInfo.PropertyType.FullName).ToString(); foreach (Dictionary <string, object> dic in saveModel.DetailData) { //不包含主键的默认添加主键默认值,用于后面判断是否为新增数据 if (!dic.ContainsKey(detailKeyInfo.Name)) { dic.Add(detailKeyInfo.Name, keyDefaultVal); if (dic.ContainsKey(mainKeyProperty.Name)) { dic[mainKeyProperty.Name] = keyDefaultVal; } else { dic.Add(mainKeyProperty.Name, keyDefaultVal); } continue; } if (dic[detailKeyInfo.Name] == null) { return(Response.Error(ResponseType.NoKey)); } //主键值是否正确 string detailKeyVal = dic[detailKeyInfo.Name].ToString(); if (!mainKeyProperty.ValidationValueForDbType(detailKeyVal).FirstOrDefault().Item1 || deatilDefaultVal == detailKeyVal) { return(Response.Error(ResponseType.KeyError)); } //判断主表的值是否正确 if (detailKeyVal != keyDefaultVal.ToString() && (!dic.ContainsKey(mainKeyProperty.Name) || dic[mainKeyProperty.Name] == null || dic[mainKeyProperty.Name].ToString() == keyDefaultVal.ToString())) { return(Response.Error(mainKeyProperty.Name + "是必填项!")); } } if (saveModel.DetailData.Exists(c => c.Count <= 2)) { return(Response.Error("系统没有配置好明细编辑的数据,请检查model!")); } return(this.GetType().GetMethod("UpdateToEntity") .MakeGenericMethod(new Type[] { detailType }) .Invoke(this, new object[] { saveModel, mainKeyProperty, detailKeyInfo, keyDefaultVal }) as WebResponseContent); }
/// <summary> /// 将数据转换成对象后最终保存 /// </summary> /// <typeparam name="DetailT"></typeparam> /// <param name="saveModel"></param> /// <param name="mainKeyProperty"></param> /// <param name="detailKeyInfo"></param> /// <param name="keyDefaultVal"></param> /// <returns></returns> public WebResponseContent UpdateToEntity <DetailT>(SaveModel saveModel, PropertyInfo mainKeyProperty, PropertyInfo detailKeyInfo, object keyDefaultVal) where DetailT : class { T mainEnity = saveModel.MainData.DicToEntity <T>(); List <DetailT> detailList = saveModel.DetailData.DicToList <DetailT>(); //删除的主键 //查出所有明细表数据的ID System.Collections.IList detailKeys = this.GetType().GetMethod("GetUpdateDetailSelectKeys") .MakeGenericMethod(new Type[] { typeof(DetailT), detailKeyInfo.PropertyType }) .Invoke(this, new object[] { detailKeyInfo.Name, mainKeyProperty.Name, saveModel.MainData[mainKeyProperty.Name].ToString() }) as System.Collections.IList; //新增对象 List <DetailT> addList = new List <DetailT>(); // List<object> containsKeys = new List<object>(); //编辑对象 List <DetailT> editList = new List <DetailT>(); //删除的主键 List <object> delKeys = new List <object>(); mainKeyProperty = typeof(DetailT).GetProperties().Where(x => x.Name == mainKeyProperty.Name).FirstOrDefault(); //获取新增与修改的对象 foreach (DetailT item in detailList) { object value = detailKeyInfo.GetValue(item); if (keyDefaultVal.Equals(value))//主键为默认值的,新增数据 { //设置新增的主表的值 mainKeyProperty.SetValue(item, saveModel.MainData[mainKeyProperty.Name] .ChangeType(mainKeyProperty.PropertyType)); if (detailKeyInfo.PropertyType == typeof(Guid)) { detailKeyInfo.SetValue(item, Guid.NewGuid()); } addList.Add(item); } else if (detailKeys.Contains(value)) { //containsKeys.Add(value); editList.Add(item); } } //获取需要删除的对象的主键 if (saveModel.DelKeys != null && saveModel.DelKeys.Count > 0) { delKeys = saveModel.DelKeys .Where(x => detailKeys.Contains(x.ChangeType(detailKeyInfo.PropertyType))) .Select(q => q.ChangeType(detailKeyInfo.PropertyType)).ToList(); } if (UpdateOnExecuting != null) { Response = UpdateOnExecuting(mainEnity, addList, editList, delKeys); if (!Response.Status) { return(Response); } } mainEnity.SetModifyDefaultVal(); //主表修改 //不修改!CreateFields.Contains创建人信息 repository.Update(mainEnity, typeof(T).GetEditField() .Where(c => saveModel.MainData.Keys.Contains(c) && !CreateFields.Contains(c)) .ToArray()); foreach (var item in saveModel.DetailData) { item.SetModifyDefaultVal(); } //明细修改 editList.ForEach(x => { //获取编辑的字段 string[] updateField = saveModel.DetailData .Where(c => c[detailKeyInfo.Name].ChangeType(detailKeyInfo.PropertyType) .Equal(detailKeyInfo.GetValue(x))) .FirstOrDefault() .Keys.Where(k => k != detailKeyInfo.Name) .Where(r => !CreateFields.Contains(r)) .ToArray(); //設置默認值 x.SetModifyDefaultVal(); //添加修改字段 repository.Update <DetailT>(x, updateField); }); //明细新增 addList.ForEach(x => { x.SetCreateDefaultVal(); repository.DbContext.Entry <DetailT>(x).State = EntityState.Added; }); //明细删除 delKeys.ForEach(x => { DetailT delT = Activator.CreateInstance <DetailT>(); detailKeyInfo.SetValue(delT, x); repository.DbContext.Entry <DetailT>(delT).State = EntityState.Deleted; }); if (UpdateOnExecuted == null) { repository.DbContext.SaveChanges(); Response.OK(ResponseType.SaveSuccess); } else { Response = repository.DbContextBeginTransaction(() => { repository.DbContext.SaveChanges(); Response = UpdateOnExecuted(mainEnity, addList, editList, delKeys); return(Response); }); } if (Response.Status) { addList.AddRange(editList); Response.Data = new { data = mainEnity, list = addList }; if (string.IsNullOrEmpty(Response.Message)) { Response.OK(ResponseType.SaveSuccess); } } return(Response); }