/// <summary> /// 设置要修改的数据 /// </summary> /// <param name="updateItem">要修改的数据</param> /// <param name="range">修改值的字段范围</param> /// <param name="upfieldnames">range指定的字段范围的字段名称</param> public void SetUpdateItem(T updateItem, FieldSelectRange range, IEnumerable <string> upfieldnames) { UpdateItem = updateItem; UpdateFieldRange = range; UpdateFieldNames = upfieldnames; OnUpdateItemChanged(); }
/// <summary> /// 缺省添加或修改检查 /// </summary> /// <param name="errs"></param> protected void DefaultCheckAddOrUpdate(IList <DataModalFieldException> errs) { IDataUpdateContext modalcontext = CurrentContext as IDataUpdateContext; if (modalcontext.ModalType != null && modalcontext.Data != null && ((modalcontext.ModalState & ModalState.AddNew) == ModalState.AddNew || (modalcontext.ModalState & ModalState.Update) == ModalState.Update)) { //检测范围 FieldSelectRange rangle = modalcontext.CheckRangle; IEnumerable <string> ranglefieldnames = modalcontext.CheckFieldNames; //数据模型 IDataModel dm = modalcontext.ModalType.GetDataModel(); IEnumerable <IDataFieldModel> fields = dm.Fields; //组合值唯一规则 IEnumerable <OnlyValueKeysAttribute> onlyattrs = SelectAttributesFromType <OnlyValueKeysAttribute>(modalcontext.ModalType); List <OnlyValueKeysAttribute> effects = new List <OnlyValueKeysAttribute>(); List <string> effectnames = new List <string>(); #region 检查每个字段 foreach (var field in fields) { //忽略该忽略的字段 if (IsIgnoreCheckField(field, rangle, ranglefieldnames)) { continue; } //检测:是否可为空、字符长度、数字范围 CheckAddOrUpdateFieldValue(dm, field, field.GetModelFieldValue(modalcontext.Data), errs); if (onlyattrs != null) { //查找并添加该字段影响到的唯一规则 到检测集合中 //条件:OnlyValueKeysAttribute.OnlyKeys包含该字段 effects.AddRange(onlyattrs.Where(f => f.OnlyKeys != null && f.OnlyKeys.FirstOrDefault(f2 => string.Equals(f2, field.Name, StringComparison.OrdinalIgnoreCase)) != null )); effectnames.Add(field.Name); } } #endregion //检查唯一规则 foreach (var ef in effects) { CheckOnlyValues(dm, ef, effectnames, modalcontext, errs); } //引用检查 CheckDataIdRefrence(dm, modalcontext, errs); } }
/// <summary> /// 是否忽略检查字段 /// </summary> /// <param name="field"></param> /// <param name="rangle"></param> /// <param name="ranglefieldnames"></param> /// <returns></returns> private bool IsIgnoreCheckField( IDataFieldModel field, FieldSelectRange rangle, IEnumerable <string> ranglefieldnames) { if (field == null) { return(true); } if (field.IsRowVersion()) { return(true); } if (field.IsSoftDeleteField()) { return(true); } if (field.GetDbGeneratedDefine() != null) { return(true); } switch (rangle) { case FieldSelectRange.IgnoreFields: //忽略指定的字段 { //指定字段是否是忽略的字段 return(ranglefieldnames != null && ranglefieldnames.FirstOrDefault(f => string.Equals(f, field.Name, StringComparison.OrdinalIgnoreCase)) != null); } case FieldSelectRange.OnlyFields: //仅检测指定的字段 { //指定的字段是否在指定字段中 //如果不在则返回true,否则返回false if (ranglefieldnames == null) { return(true); } return(ranglefieldnames.FirstOrDefault(f => string.Equals(f, field.Name, StringComparison.OrdinalIgnoreCase)) == null); } } return(false); }
/// <summary> /// 修改数据 /// </summary> /// <typeparam name="T">要修改的数据类型</typeparam> /// <param name="updateitem">要修改的数据</param> /// <param name="updaterangle">要修改的数据的字段范围</param> /// <param name="updatefieldnames">updaterangle指定的范围的字段数组</param> /// <param name="noty">修改数据的通知</param> /// <returns>返回修改数据的上下文</returns> protected DataUpdateContext UpdateData <T>(T updateitem, FieldSelectRange updaterangle, IEnumerable <string> updatefieldnames, IUpdateDataNoty noty) { CheckDataModelIsCanUpdate <T>(); DataUpdateContext dc = new DataUpdateContext() { CheckRangle = updaterangle, CheckFieldNames = updatefieldnames, UpdateRangle = updaterangle, UpdateFieldNames = updatefieldnames, Data = updateitem, ModalState = ModalState.Update, ModalType = typeof(T), UpdateDataNoty = noty }; string softdelKey = typeof(T).GetDataModel().GetSoftDeleteFieldName(); if (!string.IsNullOrEmpty(softdelKey)) { switch (updaterangle) { case FieldSelectRange.All: { dc.CheckRangle = FieldSelectRange.IgnoreFields; dc.CheckFieldNames = new string[] { softdelKey }; dc.UpdateRangle = FieldSelectRange.IgnoreFields; dc.UpdateFieldNames = new string[] { softdelKey }; break; } case FieldSelectRange.IgnoreFields: { IEnumerable <string> x = new string[] { softdelKey }; if (updatefieldnames != null) { if (updatefieldnames.FirstOrDefault(f => string.Equals(f, softdelKey, StringComparison.OrdinalIgnoreCase)) == null) { x = x.Union(updatefieldnames); } else { x = updatefieldnames; } } dc.CheckFieldNames = x; dc.UpdateFieldNames = x; break; } case FieldSelectRange.OnlyFields: { if (updatefieldnames != null) { IEnumerable <string> x = updatefieldnames.Where(f => !string.Equals(f, softdelKey, StringComparison.OrdinalIgnoreCase)).ToArray(); dc.CheckFieldNames = x; dc.UpdateFieldNames = x; } break; } } } AddUpdateContext(dc); return(dc); }
/// <summary> /// 生成修改数据的Sql表达式 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="updateItem"></param> /// <param name="updaterange"></param> /// <param name="updatefields"></param> /// <param name="paramet"></param> /// <returns></returns> internal static string GetUpdateSql <T>( T updateItem, FieldSelectRange updaterange, IEnumerable <string> updatefields, out IEnumerable <IDataParamet> paramet) where T : class { paramet = null; if (updateItem == null) { throw new ObjectIsNullException(LocalResource.UpdateItem); } StringBuilder wheresql = new StringBuilder(); StringBuilder setsql = new StringBuilder(); List <IDataParamet> paramets = new List <IDataParamet>(); IDataModel model = typeof(T).GetDataModel(); string namehz = GetIdKeyStringValues(updateItem, model); int c = 0; foreach (var k in model.PrimaryKeys) { IDataFieldModel f = model.Fields[k.Name]; DataParamet p = AppendParamet(paramets, namehz, f, updateItem); if (c == 0) { wheresql.Append(string.Format("[{0}]={1}", f.Name, p.Name)); } else { wheresql.Append(string.Format(" AND [{0}]={1}", f.Name, p.Name)); } c++; } if (wheresql.Length == 0) //没有任何主键信息 { throw new NotFoundPrimaryKeyException(typeof(T)); } IDataFieldModelCollection fields = model.Fields; c = 0; foreach (var f in fields) { if (f.IsRowVersion()) { continue; } if (f.GetDbGeneratedDefine() != null) { continue; } if (f.IsPrimaryKey() != null) { continue; } switch (updaterange) { case FieldSelectRange.All: break; case FieldSelectRange.OnlyFields: { if (updatefields == null) { continue; } if (updatefields.FirstOrDefault( ff => string.Equals(ff, f.Name, StringComparison.OrdinalIgnoreCase)) == null) { continue; } break; } case FieldSelectRange.IgnoreFields: { if (updatefields != null) { if (updatefields.FirstOrDefault( ff => string.Equals(ff, f.Name, StringComparison.OrdinalIgnoreCase)) != null) { continue; } } break; } } DataParamet p = AppendParamet(paramets, namehz, f, updateItem); if (c == 0) { setsql.AppendLine(string.Format("[{0}]={1}", f.Name, p.Name)); } else { setsql.AppendLine(string.Format(",[{0}]={1}", f.Name, p.Name)); } c++; } if (setsql.Length == 0) { return(null); } paramet = paramets.ToArray(); return(string.Format("UPDATE [{0}] SET {1} WHERE {2}", model.Name, setsql.ToString(), wheresql.ToString())); }